题目大意:n 个点, l 条边,输入一组数据 a,b 分别是该条边的两个端点。用两个颜色给端点上色,相邻两个端点颜色不能相同,问是否能涂色。
解题思路:存下每一条边的信息,若该条边通则标记,因为是无向图,交换两端点后也能通过。对于每一个点,枚举所有点的坐标,查看其和当前点构成的线是否能通,若成立,检查对应点是否涂色:若未着色,涂上与该点相反的颜色;若已着色,检查是否和当前点相同,相同则标记错误。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
bool node[500][500];
int ans[500];
int n, tag;
void dfs(int now) {
for (int i = 0; i < n; i++) {
if (node[now][i]) {
//cout<<now<<" "<<i<<" "<<ans[i]<<" "<<tag<<endl;
if (!ans[i]) {
ans[i] = -ans[now];
dfs(i);
}
else if(ans[i] == ans[now]) tag = 0;
}
}
return;
}
int main() {
while (scanf("%d", &n) != EOF && n) {
memset(node, false, sizeof(node));
memset(ans, 0, sizeof(ans));
tag = 1;
int l;
scanf("%d", &l);
int a, b;
for (int i = 0; i < l; i++) {
scanf("%d%d", &a, &b);
node[a][b] = true;
node[b][a] = true;
}
ans[0] = tag;
dfs(0);
if (!tag) printf("NOT ");
printf("BICOLORABLE.\n");
}
return 0;
}