[二分图最大匹配] BZOJ1433: [ZJOI2009]假期的宿舍

来源:互联网 发布:java 中文件带点 编辑:程序博客网 时间:2024/05/16 09:35

题意

题解

大水题,二分图匹配。对与每个人向他能睡的床建边即可。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=105, maxe=505;int n,m,_test,res[maxn];int fir[maxn],nxt[maxe],son[maxe],tot;bool sta1[maxn],sta2[maxn],g[maxn][maxn],vis[maxn];void add(int x,int y){    son[++tot]=y; nxt[tot]=fir[x]; fir[x]=tot; }int find(int x){    for(int j=fir[x];j;j=nxt[j]) if(!vis[son[j]]){        vis[son[j]]=true;        if(!res[son[j]]||find(res[son[j]])){            res[son[j]]=x;            return true;        }    }    return false;}int main(){    freopen("bzoj1433.in","r",stdin);    freopen("bzoj1433.out","w",stdout);    scanf("%d",&_test);    while(_test--){        memset(fir,0,sizeof(fir)); tot=0;        scanf("%d",&n);        for(int i=1;i<=n;i++) scanf("%d",&sta1[i]);        for(int i=1;i<=n;i++) scanf("%d",&sta2[i]);        for(int i=1;i<=n;i++)         for(int j=1;j<=n;j++) scanf("%d",&g[i][j]);        m=n;        for(int i=1;i<=n;i++){            if(!sta1[i]){                for(int j=1;j<=n;j++) if(g[i][j]&&sta1[j]) add(i,j+n);            } else{                if(!sta2[i]){                    for(int j=1;j<=n;j++) if(g[i][j]&&sta1[j]) add(i,j+n);                    add(i,i+n);                } else m--;            }        }        memset(res,0,sizeof(res));        int ans=0;        for(int i=1;i<=n;i++){            memset(vis,0,sizeof(vis));            ans+=find(i);        }        if(ans==m) printf("^_^\n");              else printf("T_T\n");    }    return 0;} 
0 0
原创粉丝点击