玄关求调
查看原帖
玄关求调
748314
yzc001楼主2025/6/21 17:31
#include<bits/stdc++.h>
using namespace std;
const int inf=0x7f7f7f7f;
int cnt=1,ans,res,head[100005],dis[100005],cur[100005];
bool vis[100005];
int n,m,s,t,liu;
struct Node{
	int nxt,v,liu,c;
}node[100005];
inline void add_bian(int u,int v,int liu,int c){
	node[++cnt].v=v;
	node[cnt].liu=liu;
	node[cnt].nxt=head[u];
	node[cnt].c=c;
	head[u]=cnt;
	node[++cnt].v=u;
	node[cnt].liu=0;
	node[cnt].nxt=head[v];
	node[cnt].c=-c;
	head[v]=cnt;
}
queue<int>q;
int spfa(){
	memset(dis,0x7f,sizeof(dis));
	q.push(s);
	dis[s]=0;
	vis[s]=1;
	while(!q.empty()){
		int u=q.front();
		q.pop(),vis[u]=0;cur[u]=head[u];
		for(int i=head[u];i;i=node[i].nxt){
			int v=node[i].v;
			if(node[i].liu&&(dis[v]>dis[u]+node[i].c)){
				dis[v]=dis[u]+node[i].c;
				if(!vis[v])q.push(v),vis[v]=1;
			}
		}
	}
	return dis[t]!=inf;
}
int dfs(int u,int flow){
    // cout<<u<<' '<<flow<<'\n';
	if(u==t)return flow;
	vis[u]=1;
	int ans=0;
	for(int i=cur[u];i&&ans<flow;i=node[i].nxt){
		int v=node[i].v;cur[u]=i;
		if(!vis[v]&&node[i].liu&&dis[v]==dis[u]+node[i].c){
			int x=dfs(v,min(node[i].liu,flow-ans));
			if(x)res+=x*node[i].c,node[i].liu-=x,node[i^1].liu+=x,ans+=x;
		}
	}
	vis[u]=0;
	return ans;
}
int Dinic(){
	int x;
	while(spfa()){
		while(x=dfs(s,inf))ans+=x;
	}
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m,a; 
	cin>>m;
	s=80001;t=80002;
	while(m--){
		cin>>n;
		for(int i=1;i<=n;i++)add_bian(s,i,1,1);
		for(int i=1;i<=n;i++)add_bian(i+n,t,1,1);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				cin>>a;
				if(a)add_bian(i,j+n,1,1);
			}
		}
		if(Dinic()==n)cout<<"Yes\n";
		else cout<<"No\n";
		memset(node,0,sizeof(node));
		memset(head,0,sizeof(head));
		memset(vis,0,sizeof(vis));
		memset(dis,0,sizeof(dis));
		memset(cur,0,sizeof(cur));
		cnt=0;ans=0;
	}
	return 0;
}
2025/6/21 17:31
加载中...