HDU 2444 判断是否为二分图

来源:互联网 发布:北航软件考研分数线 编辑:程序博客网 时间:2024/06/05 14:03


题意:给你n,m,问是否为二分图,若是找出他的最大二分匹配。。。。



#include <queue>#include <cstring>#include <iostream>using namespace std;const int N = 220;int col[N], g[N][N],n,m;int ans[N],vis[N],sum;int queu[N],judge[N];//0为白色,1为黑色 bool bfs(){ //二分图BFS判断    queue<int> p;memset(col, -1, sizeof(col));    p.push(1);    col[1] = 0;    while(!p.empty()) {        int from = p.front();        p.pop();        for(int i = 1; i <= n; i++) {            if(g[from][i] && col[i] == -1) {                p.push(i);                col[i] = (col[from]+1)%2;//染成不同的颜色             }else if(g[from][i] && col[from] == col[i])//颜色有相同,则不是二分图                 return false;        }    }    return true;    }int dfs(int id){    for(int i=1;i<=n;i++)    {       if(vis[i]==0&&g[id][i])       {           vis[i]=1;           if(ans[i]==-1||dfs(ans[i]))           {              ans[i]=id;              return 1;           }       }    }    return 0;}int main() {    int a, b, i;        while(cin >> n >> m)    {        memset(g,0,sizeof(g));        for(i = 0; i < m; i++) {            cin >> a >> b;            g[a][b] = g[b][a] = 1;         }if(!bfs()){    cout << "No" <<endl;                    continue;}sum=0;memset(ans,-1,sizeof(ans));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(dfs(i)) sum++;}cout<<sum/2<<endl;}return 0;}


0 0
原创粉丝点击