一直全WA,求调
查看原帖
一直全WA,求调
428449
Amon_Xolotl楼主2023/8/14 10:20
#include<bits/stdc++.h>
using namespace std;
const int N=150,inf=1e9+10;
int T,n;
int c[N];
int a[N],w[N][N];
struct Edge
{
	int from,to,cap,flow;
	Edge(int u,int v,int w,int f) : from(u), to(v), cap(w), flow(f) {}
};
vector<int> G[N];
vector<Edge> edge;
int dep[N],cur[N],k;
void add(int u,int v,int w)
{
	edge.push_back(Edge(u,v,w,0));
	edge.push_back(Edge(v,u,0,0));
	k=edge.size();
	G[u].push_back(k-2);
	G[v].push_back(k-1);
}
void init()
{
	for(int i=1;i<=N;++i)
	{
		G[i].clear();
	}
	edge.clear();
}
bool vis[N];
bool bfs()
{
	memset(vis,0,sizeof(vis));
	queue<int> q;
	vis[0]=1;
	dep[0]=0;
	q.push(0);
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=0;i<G[x].size();++i)
		{
			Edge& e=edge[G[x][i]];
			if(!vis[e.to]&&e.cap>e.flow)
			{
				vis[e.to]=1;
				dep[e.to]=dep[x]+1;
				q.push(e.to);
			}
		}
	}
	return vis[2*n+1];
}
int dfs(int x,int a)
{
	if(x==2*n+1||a==0)
	{
		return a;
	}
	int flow=0,f;
	for(int& i=cur[x];i<G[x].size();++i)
	{
		Edge& e=edge[G[x][i]];
		if(dep[e.to]==dep[x]+1&&(f=dfs(e.to,min(a,e.cap-e.flow))))
		{
			e.flow+=f;
			edge[G[x][i]^1].flow-=f;
			a-=f;
			flow+=f;
			if(a==0)
			{
				break;
			}
		}
	}
	return flow;
}
int main()
{
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		init();
		int ans=0;
		for(int i=1;i<=n;++i)
		{
			scanf("%d",&c[i]);			
			if(c[i])
			{
				add(i+n,2*n+1,1);
			}
		}
		for(int i=1;i<=n;++i)
		{
			scanf("%d",&a[i]);		
			if(!c[i]||(c[i]&&!a[i]))
			{
				add(0,i,1);
				++ans;
			}
		}
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=n;++j)
			{
				scanf("%d",&w[i][j]);
				if(w[i][j]||i==j)
				{
					add(i,j+n,1);
				}
			}
		}
		int flow=0;
		while(bfs())
		{
			memset(cur,0,sizeof(cur));
			flow+=dfs(0,inf);
			//cout<<flow<<endl;
		}
		if(flow>=ans)
		{
			cout<<"^_^"<<endl;
		}
		else
		{
			cout<<"T_T"<<endl;
		}
	}
	return 0;
}
2023/8/14 10:20
加载中...