全T是什么鬼
查看原帖
全T是什么鬼
763878
Jerry_heng楼主2023/11/25 17:14
#include<bits/stdc++.h>
using namespace std;
int q,n,a[101],s,t,cnt,c,b[101],head[101],dep[101],cur[101];
const int inf=1e9+7;
struct node{
	int to,nxt,val;
}edge[100010];
void add(int u,int v){
	edge[++cnt]=(node){v,head[u],1};
	head[u]=cnt;
	edge[++cnt]=(node){u,head[v],0};
	head[v]=cnt;
}
bool bfs(){
	memset(dep,0,sizeof dep);
	memcpy(cur,head,sizeof cur);
	queue<int>q;
	q.push(s);
	dep[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(dep[v]||!edge[i].val)continue;
			dep[v]=dep[u]+1;
			q.push(v);
		}
	}
	return dep[t];
}
int dfs(int now,int fl){
	int flow=0;
	if(now==t)return fl;
	for(int i=cur[now];i&&fl;i=edge[i].nxt){
		cur[now]=i;
		int v=edge[i].to;
		if(dep[v]!=dep[now]+1||!edge[i].val)continue;
		int c=dfs(v,min(fl,edge[i].val));
		flow+=c,fl-=c;
		edge[i].val-=c,edge[i^1].val+=c;
	}
	return flow;
}
int main(){
	cin>>q;
	while(q--){
		cin>>n;
		s=0,t=2*n+1,cnt=1,c=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(a[i])add(i+n,t);
		}
		for(int i=1;i<=n;i++){
			cin>>b[i];
			if((a[i]&&b[i]==0)||!a[i])add(s,i),c++;
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++){
				int x;
				cin>>x;
				if(i==j||x)add(i,j+n);
			}
		int ans=0;
		while(bfs()){
			ans+=dfs(s,inf);
		}
		if(ans==c)puts("^_^");
		else puts("T_T");
	}
	return 0;
} 
2023/11/25 17:14
加载中...