费用流模板求调(玄关
查看原帖
费用流模板求调(玄关
1423269
ini_____楼主2024/12/25 20:42
#include<bits/stdc++.h>
#define pii pair<int,int>
#define mp make_pair 
using namespace std;
const int N=201,M=10210*2,inf=0x3f;
int n,m,s,t;
int h[N],e[M],ne[M],f[M],w[M],idx;
int d[N],incf[N],pre[N];
bool vis[N];
void add(int a,int b,int c,int d){
	e[idx]=b,f[idx]=c,w[idx]=d,ne[idx]=h[a],h[a]=idx++;
	e[idx]=a,f[idx]=0,w[idx]=-d,ne[idx]=h[b],h[b]=idx++;
}
queue<int> q;
bool spfa(){
	while(!q.empty())q.pop();
	memset(d,inf,sizeof d);
	memset(incf,0,sizeof incf);
	q.push(s),d[s]=0,incf[s]=inf;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=h[u];~i;i=ne[i]){
			int v=e[i];
			if(f[i] && d[v]>d[u]+w[i]){
				d[v]=d[u]+w[i];
				pre[v]=i;
				incf[v]=min(f[i],incf[u]);
				if(!vis[v]){
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	return incf[t]>0;
}
pii EK(){
	int flow=0,cost=0;
	while(spfa()){
		int fn=incf[t];
		flow+=fn,cost+=fn*d[t];
		for(int i=t;i!=s;i=e[pre[i]^1]){
			f[pre[i]]-=fn;
			f[pre[i]^1]+=fn;
		}
	}
	return mp(flow,cost);
}
int main(){
    memset(h,-1,sizeof h);
	cin>>m>>n;
	s=0,t=n+m+1;
	for(int i=1;i<=m;i++){
		int tem;cin>>tem;
		add(s,i,tem,0);
	}
	for(int i=m+1;i<=m+n;i++){
		int tem;cin>>tem;
		add(i,t,tem,0);
	}
	for(int i=1;i<=m;i++){
		for(int j=m+1;j<=m+n;j++){
			int tem;cin>>tem;
			add(i,j,inf,tem);
		}
	}
	cout<<EK().second<<endl;
	for(int k=0;k<idx;k+=2){
		f[k]+=f[k^1];w[k]=-w[k];
		f[k^1]=0;w[k^1]=-w[k^1];
	}
	cout<<-EK().second<<endl;
}

rt,只有18pts

2024/12/25 20:42
加载中...