题目:https://www.luogu.org/problemnew/show/P2055
二分图匹配;
注意要连边的话对方必须有床!
代码如下:
#include#include #include #include using namespace std; int T,n,hd[55],ct,pre[55]; bool in[55],hm[55],vis[55]; struct N{ int to,nxt; N(int t=0,int n=0):to(t),nxt(n) {} }ed[2505]; void add(int x,int y){ed[++ct]=N(y,hd[x]); hd[x]=ct;} bool dfs(int x) { for(int i=hd[x],u;i;i=ed[i].nxt) { if(vis[u=ed[i].to])continue; vis[u]=1; if(!pre[u]||dfs(pre[u])){pre[u]=x; return 1;} } return 0; } int main() { scanf("%d",&T); while(T--) { ct=0; memset(hd,0,sizeof hd); memset(in,0,sizeof in); memset(hm,0,sizeof hm); memset(pre,0,sizeof pre); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&in[i]); if(in[i])add(i,i); } for(int i=1;i<=n;i++) { scanf("%d",&hm[i]); } for(int i=1,x;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&x); if(x&&in[j])add(i,j);//对方要有床!!! } bool fl=0; for(int i=1;i<=n;i++) { if(in[i]&&hm[i])continue; memset(vis,0,sizeof vis); if(!dfs(i)){fl=1; break;}//! } if(!fl)printf("%c%c%c\n",94,95,94); else printf("%c%c%c\n",84,95,84); } return 0; }