UVA-10004
题意:给出m条边,求这个图能不能用2个颜色染色这个图。
解题思路:找到一个未染色的点进行染色,然后进行BFS,相邻的点未染色就染成和它相反的颜色,如果已经染色,就判断颜色是否不一样,如果出现一样,则代表整个图染色失败。图可能存在多个联通块,所以要找到一个未染色的就BFS。
/*************************************************************************
> File Name: UVA-10004.cpp
> Author: Narsh
>
> Created Time: 2016年07月21日 星期四 14时56分57秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int map[300][300],color[210],q[30000];
int n,m;
int main() {
//freopen("xx.in","r",stdin);
while (scanf("%d",&n) && n) {
scanf("%d",&m);
memset(map,0,sizeof(map));
for (int i = 1; i <= m; i++) {
int a,b;
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=1;
color [a] = color [b] =0;
}
int h , t, flag = 1;
for (int l = 0; l < n; l++)
if (color[l] == 0){
color[l] = 1;
q[1]=l;
h=0;t=1;
while (h < t) {
h++;
int x = q[h];
for (int i = 0; i < n; i++)
if (map[x][i] == 1){
if (color[i] == 0) {
t++;
color[i]=-color[x];
q[t]=i;
}else {
if (color[i] == color[x] ) {
flag=0;
h=t+3;
break;
}
}
}
}
}
if (flag) printf("BICOLORABLE.\n");
else printf("NOT BICOLORABLE.\n");
}
}