问题
http://hihocoder.com/contest/hiho33/problem/1
解法
先找一个节点染成白色,将子节点染成黑色,做宽度优先搜索进行染色,如果发现两个节点有边链接,但是颜色相同就返回错误。当存在多个联通分量时,要多次选择节点。
#include <bits/stdc++.h>
using namespace std;
enum {maxn = 10000+4};
vector<int> G[maxn];
int color[maxn];
int main()
{
int n, m, t;
scanf("%d", &t);
while(t--){
scanf("%d %d", &n, &m);
for(int i=1; i<=n; ++i) G[i].clear();
memset(color, -1, sizeof(color));
while(m--){
int a, b;
scanf("%d %d", &a, &b);
G[a].push_back(b);
G[b].push_back(a);
}
color[1] = 0;
int colorNum = 1;
queue<int> q;
q.push(1);
while(colorNum < n)
{
if (q.empty())
{
for (int i=1; i<=n; ++i)
if (color[i]== -1)
{
color[i] = 0;
colorNum++;
q.push(i);
break;
}
}
int now = q.front(); q.pop();
int j;
for (j=0; j< G[now].size(); ++j)
{
if (color[G[now][j]] == -1)
{
color[G[now][j]] = !color[now];
colorNum++;
q.push(G[now][j]);
}
else{
if (color[G[now][j]] == color[now])
break;
}
}
if (j != G[now].size())
break;
}
printf("%s\n", colorNum == n ? "Correct": "Wrong");
}
return 0;
}