1. 程式人生 > >洛谷 2055 [ZJOI2009]假期的宿舍——二分圖匹配

洛谷 2055 [ZJOI2009]假期的宿舍——二分圖匹配

https 二分 for nbsp href mem pre getch turn

題目: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; }

洛谷 2055 [ZJOI2009]假期的宿舍——二分圖匹配