矩陣遊戲[最大匹配]
阿新 • • 發佈:2018-12-02
如果Map[i][j]=1 就表示第j列可以換到第i列來滿足i , 於是add(i,j)
跑最大匹配 , 中途匹配失敗就break了
#include<bits/stdc++.h> #define N 205 #define M N*N using namespace std; int first[N],next[M],to[M],tot; int T,n,Map[N][N],vis[M],match[M]; void add(int x,int y){ next[++tot]=first[x],first[x]=tot,to[tot]=y; } void Init(){ memset(first,0,sizeof(first)); memset(next,0,sizeof(next)); memset(to,0,sizeof(to)); tot=0; memset(match,0,sizeof(match)); memset(Map,0,sizeof(Map)); } bool find(int x){ for(int i=first[x];i;i=next[i]){ int t=to[i]; if(!vis[t]){ vis[t]=1; if(!match[t] || find(match[t])){ match[t]=x; return true; } } }return false; } int main(){ scanf("%d",&T); while(T--){ int flag=0; Init(); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&Map[i][j]); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) if(Map[i][j]==1) add(i,j); } for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(!find(i)){flag=1; break;} } if(flag) printf("No\n"); else printf("Yes\n"); }return 0; }