题目大意:n个节点编号从0~n-1。m个关系表示他们连在一起。要求给两种色对所有点进行着色。要求连在一起的不能同色。
解题思路:用二维数组存他们的关系,一个标记数组标记是否着色,着色以后的颜色。循环未着色的点作为参数进入dfs,所有与它有关系的点,如果已经着色,判断是否与它同色,同色则不能,未着色则着色上与之不同的颜色。并进入下一层的dfs。如果a与b连着,map[a][b]与map[b][a]都赋值为1。有些if后的括号不能省略。。。因为else就近结合。
ac代码:
#include <iostream>
#include <cstring>
using namespace std;
int n, m, vis[1005], map[1005][1005], t1, t2, jud;
void dfs(int a)
{
for (int i=0; i<n; i++)
if (map[a][i])
if (vis[i]){
if (vis[i] == vis[a]){
jud = 0;
return ;
}
}
else{
vis[i] = (vis[a] == 2?1:2);
dfs(i);
}
}
int main()
{
while (scanf("%d", &n)!=EOF && n){
memset(vis, 0, sizeof(vis));
memset(map, 0, sizeof(map));
scanf("%d", &m);
jud = 1;
for (int i=0; i<m; i++){
scanf("%d%d", &t1, &t2);
map[t2][t1] = map[t1][t2] = 1;
}
for (int i=0; i<n; i++)
if (!vis[i]){
vis[i] = 1;
dfs(i);
if (!jud)
break;
}
if (jud)
printf("BICOLORABLE.\n");
else
printf("NOT BICOLORABLE.\n");
}
return 0;
}