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 printf
using 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;
}