hdu 2444 The Accomodation of Students

来源:互联网 发布:启翔网络 编辑:程序博客网 时间:2024/04/27 13:57

1.先判断是否为二分图:一边的标记为1,另一边标记为2,如果两边都是1或者都是2的话,就说明不是二分图,我使用的是直接使用两个for进行循环,即可判断。

2.再找二分图的最大匹配。

http://acm.hdu.edu.cn/showproblem.php?pid=2444

#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxn 205int vis[maxn];int mp[maxn][maxn];int n,m,mark ;int g[maxn];int findx(int a1){    int i;    for(i=1;i<=n;i++){        if(mp[a1][i]==1&&vis[i]==0){            vis[i] = 1;            if(g[i]==0||findx(g[i])){                g[i] = a1;                return 1;            }        }    }    return 0;}int main(void){    int i,j,tempa,tempb,ans;    while(~scanf("%d %d",&n,&m)){        memset(mp,0,sizeof(mp));        for(i=0;i<m;i++){            scanf("%d %d",&tempa,&tempb);            mp[tempa][tempb] = 1;        }        mark = 0;        memset(vis,0,sizeof(vis));        for(i=1;i<=n;i++){            for(j=1;j<=n;j++){                if(mp[i][j]==1){                    if(vis[i]==0&&vis[j]==0){                        vis[i] = 1;vis[j] = 2;                    }                    else if(vis[i]==vis[j]){                        mark = 1; break;                    }                    else if(vis[i]>0){                        if(vis[i]==1)vis[j] = 2 ;                        else vis[j] = 1;                    }                    else{                        if(vis[j]==1)vis[i] = 2;                        else vis[i] = 1;                    }                }            }            if(mark)break;        }        if(mark){puts("No");continue;}        ans = 0;        memset(g,0,sizeof(g));        for(i=1;i<=n;i++){            memset(vis,0,sizeof(vis));            ans += findx(i);         }        printf("%d\n",ans);    }}


0 0
原创粉丝点击