UVA 10004 - Bicoloring

题目大意:给你 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;
}


你可能感兴趣的:(UVA 10004 - Bicoloring)