分析:因为这道题只给了两种颜色,所以可以投机取巧的用bfs做,判断用木有两个结点的level相同。不过貌似就是这样做,有Four Color Map Theorem,所以给了四种颜色绝对是可以滴。那么就考虑三种颜色。现在木考虑到,谁能告诉我啊!(晚上回去想想吧,囧)
下面是本题AC代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 210;
int map[maxn][maxn];
int nodeLevel[maxn];
bool vis[maxn][maxn];
bool Vis[maxn];
int q[maxn*maxn];
int n,m;
void bfs(int S)
{
int front = 1;
int rear = 1;
q[front] = S;
Vis[S] = true;
while(front <= rear)
{
int v = q[front++];
for(int i = 0;i < n;i++)
{
if(map[v][i])
{
if(!Vis[i])
{
Vis[i] = true;
vis[v][i] = true;
nodeLevel[i] = nodeLevel[v] + 1;
q[++rear] = i;
}
if(nodeLevel[v] == nodeLevel[i] && !vis[i][v])
{
printf("NOT BICOLORABLE.\n");
return;
}
}
}
}
printf("BICOLORABLE.\n");
return;
}
int main()
{
while(scanf("%d",&n) && n)
{
memset(vis,false,sizeof(vis));
memset(Vis,false,sizeof(Vis));
memset(map,0,sizeof(map));
memset(nodeLevel,0,sizeof(nodeLevel));
scanf("%d",&m);
for(int i = 0;i < m;i++)
{
int p,q;
scanf("%d%d",&p,&q);
map[p][q] = map[q][p] = 1;
}
bfs(0);
}
return 0;
}