标签:sizeof || pair dig bre nbsp read flow char
显然,一行上如果在第j列为‘1’,那么这一行就可以被换到第j行。换一个说法,题目就是让我们判断是否有一个方案,使得每一行i都有列上满足i位置是1行来跟他匹配。
显然这是个二分图匹配(列->行),直接建图跑Dinic即可。
1 #include<bits/stdc++.h> 2 #define INTMAX 2147483647LL 3 #define PII pair<int,int> 4 #define MK make_pair 5 #define re register 6 using namespace std; 7 typedef long long ll; 8 const double Pi=acos(-1.0); 9 const int Inf=0x3f3f3f3f; 10 const int MAXN=405; 11 inline int read(){ 12 re int x=0,f=1,ch=getchar(); 13 while(!isdigit(ch))f=ch==‘-‘?-1:1,ch=getchar(); 14 while(isdigit(ch))x=x*10+ch-48,ch=getchar(); 15 return x*f; 16 } 17 inline ll readll(){ 18 re ll x=0,f=1,ch=getchar(); 19 while(!isdigit(ch))f=ch==‘-‘?-1:1,ch=getchar(); 20 while(isdigit(ch))x=x*10+ch-48,ch=getchar(); 21 return x*f; 22 } 23 24 struct Edge{ 25 int to,nxt,cap; 26 }e[MAXN*MAXN<<1]; 27 int cnt=1,head[MAXN]; 28 inline void add_edge(int u,int v,int cap){ 29 e[++cnt].to=v;e[cnt].cap=cap;e[cnt].nxt=head[u];head[u]=cnt; 30 e[++cnt].to=u;e[cnt].cap=0;e[cnt].nxt=head[v];head[v]=cnt; 31 } 32 33 int TT,n,S,T,Maxflow; 34 int dep[MAXN]; 35 inline void Init(){ 36 cnt=1;Maxflow=0; 37 memset(head,0,sizeof(head)); 38 memset(e,0,sizeof(e)); 39 } 40 queue<int> q; 41 inline bool bfs(){ 42 while(!q.empty()) q.pop(); 43 memset(dep,0,sizeof(dep)); 44 dep[S]=1;q.push(S); 45 while(!q.empty()){ 46 int x=q.front();q.pop(); 47 for(int i=head[x],y;i;i=e[i].nxt){ 48 y=e[i].to; 49 if(e[i].cap&&!dep[y]){ 50 dep[y]=dep[x]+1; 51 q.push(y); 52 } 53 } 54 } 55 return dep[T]; 56 } 57 inline int dfs(int x,int flow){ 58 if(x==T||!flow) return flow; 59 int used=0; 60 for(int i=head[x],y;i;i=e[i].nxt){ 61 y=e[i].to; 62 if(e[i].cap&&dep[y]==dep[x]+1){ 63 int f=dfs(y,min(e[i].cap,flow-used)); 64 if(f){ 65 e[i].cap-=f; 66 e[i^1].cap+=f; 67 used+=f; 68 if(used==flow) break; 69 } 70 } 71 } 72 return used; 73 } 74 75 inline void Dinic(){ 76 while(bfs()){ 77 Maxflow+=dfs(S,Inf); 78 } 79 } 80 int main(){ 81 TT=read(); 82 while(TT--){ 83 Init(); 84 n=read(); 85 S=402;T=403; 86 for(int i=1,x;i<=n;++i){ 87 add_edge(S,i,1); 88 add_edge(i+n,T,1); 89 for(int j=1;j<=n;++j){ 90 x=read(); 91 if(x) 92 add_edge(i,n+j,1); 93 } 94 } 95 Dinic(); 96 if(Maxflow==n) puts("Yes"); 97 else puts("No"); 98 } 99 return 0; 100 }
标签:sizeof || pair dig bre nbsp read flow char
原文地址:https://www.cnblogs.com/LI-dox/p/11257633.html