您的位置:首页 > 其它

UVA 10004 - Bicoloring

2014-08-17 14:19 369 查看
题目大意:给你 N 个结点, L 条边的强连通图(任意两个结点必有一条直接或间接地的路使这两个结点联通),问能否只用两种颜色这些结点上色,使之相邻的结点颜色都不同

解题思路:从起点出发,DFS 探索所有可走的路,到下一个结点时,给他上色,检查此结点是否有一样颜色的与之连接的结点,如果有,结束探索

#include <cstdio>
#include <cstring>

int edge[205][205], vis[205], flag, n;

bool dfs(int cur, int color) {
for (int i = 0; i < n; i++)
if (edge[cur][i] && vis[i] == vis[cur])
flag = 0;

for (int i = 0; i < n && flag; i++)
if (edge[cur][i] && !vis[i]) {
vis[i] = color * -1;
dfs(i, color * -1);
}
}

int main() {
while (scanf("%d", &n), n) {
memset(edge, 0, sizeof(edge));
memset(vis, 0, sizeof(vis));
flag = vis[0] = 1;

int l, a, b;
scanf("%d", &l);
while (l--) {
scanf("%d%d", &a, &b);
edge[a][b] = edge[b][a] = 1;
}

dfs(0, 1);
printf(flag ? "BICOLORABLE.\n" : "NOT BICOLORABLE.\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: