洛谷 2055 [ZJOI2009]假期的宿舍——二分图匹配
题目:https://www.luogu.org/problemnew/show/P2055
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=55; int T,n,hd[N],xnt,to[N*N],nxt[N*N],pre[N]; bool vis[N],hj[N],flag; int rdn() { int ret=0;char ch=getchar(); while(ch>'9'||ch<'0')ch=getchar(); while(ch>='0'&&ch<='9')(ret*=10)+=ch-'0',ch=getchar(); return ret; } void add(int x,int y) { to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt; } bool dfs(int cr) { for(int i=hd[cr],v;i;i=nxt[i]) if(!vis[v=to[i]]) { vis[v]=1; if(!pre[v]||dfs(pre[v])) {pre[v]=cr;return true;} } return false; } int main() { T=rdn(); while(T--) { memset(hd,0,sizeof hd);xnt=0; memset(pre,0,sizeof pre);flag=0; n=rdn();bool x; for(int i=1;i<=n;i++) { x=rdn();if(x)vis[i]=1;else vis[i]=0; } for(int i=1;i<=n;i++) { x=rdn();if(!vis[i]){hj[i]=0;continue;} if(x)hj[i]=1; else hj[i]=0,add(i,i); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { x=rdn();if(x&&!hj[i]&&vis[j])add(i,j); } for(int i=1;i<=n;i++) if(!hj[i]) { memset(vis,0,sizeof vis); if(!dfs(i)){flag=1;break;} } if(flag)printf("%c%c%c\n",84,95,84);else printf("%c%c%c\n",94,95,94); } return 0; }