萌新刚学OI,Dinic爆零求调
查看原帖
萌新刚学OI,Dinic爆零求调
590386
_LX_楼主2023/7/13 18:46
#include<bits/stdc++.h>
using namespace std;
#define MAXN 5005
#define INF 2147483647
int n,m=1,s,t,ans,g;
struct Edge{
	int t,v,sl;
}edge[1000002];
vector<int>v[3000];
int cc[400000];
queue<int>q;
inline void reset(){
	memset(cc,0,sizeof(cc));
	for(int i=0;i<3000;i++) v[i].clear();
	m=1;
	n=s=t=ans=g=0;
	return;
}
inline void input(int x,int y,int z,int t){
	edge[t].t=y;
	edge[t].v=z;
	edge[t].sl=z;
	v[x].push_back(t);

	edge[t+1].t=x;
	edge[t+1].v=z;
	edge[t+1].sl=0;
	v[y].push_back(t+1);
	return;
}
inline bool bfs(){
	memset(cc,-1,sizeof(cc));
	while(!q.empty()) q.pop();
	q.push(s);
	cc[s]=0;
	while(!q.empty()){
		int tp=q.front();
		q.pop();
		for(int i=0;i<(int)v[tp].size();i++){
			int tt=edge[v[tp][i]].t;
			if(cc[tt]!=-1||edge[v[tp][i]].sl<=0) continue;
			cc[tt]=cc[tp]+1;
			q.push(tt);
			if(tt==t) return 1;
		}
	}
	return 0;
}
inline int dfs(int x,int in){
	if(x==t) return in;
	int sum=0;
	for(int i=0;i<(int)v[x].size();i++){
		int tt=edge[v[x][i]].t;
		if(edge[v[x][i]].sl>0&&cc[tt]==cc[x]+1){
			int k=dfs(tt,min(in,edge[v[x][i]].sl));
			if(!k) cc[tt]=-1;
			edge[v[x][i]].sl-=k;
			edge[v[x][i]^1].sl+=k;
			sum+=k;
			in-=k;
		}
	}
	return sum;
}
signed main(){
	int T;
	scanf("%d",&T);
	while(T--){
		reset();
		scanf("%d",&n);
		s=0,t=1;
		int k=1;
		int students[55];
		for(int i=1;i<=n;i++,k++){
			scanf("%d",&students[i]);
			if(students[i]){
				input(k,t,1000,m);
				m+=2;
			}
		}
		for(int i=1;i<=n;i++,k++){
			int f;
			scanf("%d",&f);
			if(students[i]&&!f){
				input(s,k,1000,m);
				m+=2;g++;
			}
			else if(!students[i]){
				input(s,k,1000,m);
				m+=2;g++;
			}
		}
		for(int i=1;i<=n;i++){
			input(i+n+1,i+1,1000,m);
			m+=2;
			for(int j=1;j<=n;j++){
				int f;
				scanf("%d",&f);
				if(f==1){
					input(j+n,i,1000,m);
					m+=2;
				}
			}
		}
		m-=2;
		while(bfs()) ans+=dfs(s,INF);
		if(g*1000<=ans) printf("^_^\n");
		else printf("T_T\n");
	}
	return 0;
}
2023/7/13 18:46
加载中...