POJ 2492 二分图判断 并查集

来源:互联网 发布:达内培训 南京java 编辑:程序博客网 时间:2024/06/05 08:29

POJ - 2492
题意:给出N个BUG 和 M个BUG的性关系 判断是否有同性关系

可以用二分图判断来做 也可以用并查集来做 明天补上并查集

二分图:

如果这N个BUG间只有异性间有关系 那么对这N个BUG做一个关系图 同性之间的BUG之间没有联系 联系建立在不同的性别之间 可以将点集分成两个类别 A B 集合内部没有联系 则这个图为二分图
于是使用二分图判断的常用方法,图染色法 两种颜色将图 可以将相邻点染不同色 则为二分图 用DFS来判断是否为二分图
有一个坑点:这个图可能是由若干个二分图构成的图 所有要对每个联通图进行判断

代码如下:

#include <cstdio>#include <iostream>#include <cstring>#define sf scanf#define pf printfusing namespace std;const int maxn = 2000 + 5;int color[maxn];bool Adj[maxn][maxn];int n,m;bool DFS(int cur){    for(int i = 1;i <= n;++i){        if(Adj[i][cur]){            if(color[i] == color[cur]){                return false;            }            if(color[i] == -1){                color[i] = color[cur] == 0 ? 1 : 0;                if( DFS(i) == false ) return false;            }        }    }    return true;}int main(){    int T;sf("%d",&T);    int ca = 0;    while(T--){        sf("%d%d",&n,&m);        memset(Adj,0,sizeof(Adj));        for(int i = 0;i < m;++i){            int u,v;sf("%d%d",&u,&v);            Adj[u][v] = Adj[v][u] = 1;        }        memset(color,-1,sizeof(color));        bool ans = true;        for(int i = 1;i <= n;++i){            if(color[i] == -1){                color[i] = 0;                ans = DFS(i);            }            if(!ans) break;        }        pf("Scenario #%d:\n",++ca);        if(ans){            pf("No suspicious bugs found!\n");        }        else pf("Suspicious bugs found!\n");        if(T) pf("\n");    }    return 0;}
0 0
原创粉丝点击