萌新刚学网络流 过样例了全wa求助
查看原帖
萌新刚学网络流 过样例了全wa求助
185026
NOIPer40楼主2020/10/22 13:34
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 60
#define maxm 6010
using namespace std;
int t,n,m,flag[maxn],head[maxn],nxt[maxm],to[maxm],cap[maxm],cnt=1,dep[maxn],cur[maxn],ans,k;
queue<int> q;
void con(int u,int v,int c){
	to[++cnt]=v;
	cap[cnt]=c;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
void add(int u,int v,int c){
	con(u,v,c);
	con(v,u,0);
}
bool bfs(){
	memset(dep,0,sizeof(dep));
	dep[0]=1;
	cur[0]=head[0];
	q.push(0);
	while(!q.empty()){
		int f=q.front();
		q.pop();
		for(int i=head[f];i;i=nxt[i]){
			int ti=to[i];
			if(!dep[ti] && cap[i]){
				dep[ti]=dep[f]+1;
				cur[ti]=head[ti];
				q.push(ti);
			}
		}
	}
	return dep[n+1];
}
int dfs(int x,int flow){
	if(x==n+1 || !flow)
		return flow;
	int maxf=0,rest=flow;
	for(int i=cur[x];i;i=nxt[i]){
		int ti=to[i],res;
		cur[x]=i;
		if(dep[ti]==dep[x]+1 && cap[i]){
			res=dfs(ti,min(rest,cap[i]));
			if(res){
				cap[i]-=res;
				cap[i^1]+=res;
				maxf+=res;
				rest-=res;
				if(!rest)
					break;
			}
		}
	}
	return maxf;
}
int main(){
	scanf("%d",&t);
	for(int T=1;T<=t;T++){
		cnt=ans=k=0;
		memset(head,0,sizeof(head));
		memset(nxt,0,sizeof(nxt));
		memset(to,0,sizeof(to));
		memset(cap,0,sizeof(cap));
		memset(flag,0,sizeof(flag));
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d",&flag[i]);
			add(i,n+1,flag[i]);
		}
		for(int i=1;i<=n;i++){
			int flag_;
			scanf("%d",&flag_);
			if(!flag[i])
				flag_=1;
			add(0,i,flag_);
			k+=flag_;
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				scanf("%d",&flag[j]);
				add(i,j,flag[j]);
			}
		while(bfs())
			ans+=dfs(0,1e9);
		if(ans==k)
			printf("^_^\n");
		else
			printf("T_T\n");
	}
}
2020/10/22 13:34
加载中...