10004 - Bicoloring(BFS)

题目:10004 - Bicoloring


题目大意:将给定的图的节点染色,颜色只有两种,并且要求相邻的节点颜色不同,且无向图里面没有自环且是强连通的;

解题思路:因为是强连通的,所以用BFS可以访问到每个节点,并且相邻节点还可以染成不同的颜色。当染色冲突时,就说明这个图不可以二染色,如果顺利的都染色了,没有冲突,这个图就可以二染色。


#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

int v, e;
const int N = 205;

int G[N][N], color[N];

queue<int> q;

int bfs (int t) {
	
	color[t] = 1;
	q.push(t);
	while(!q.empty()) {
		
		t = q.front();
		q.pop();
		for(int i = 0; i < v; i++) {

			if(G[t][i] && !color[i]) {

				color[i] = - color[t];
				q.push(i);
			}
			else  {

				if(G[t][i]) 
					if(color[i] + color[t] != 0)
						return 0;
			}
		}
	}
	return 1;
}

int main() {

	while(scanf("%d", &v) , v ) {

		memset(G, 0, sizeof(G));
		memset(color, 0, sizeof(color));
		scanf("%d", &e);
		int i, x, y;
		for(i = 0; i < e; i++) {
			
			scanf("%d%d", &x, &y);
			G[x][y] = 1;
			G[y][x] = 1;
		}
		if(bfs(x))
			printf("BICOLORABLE.\n");
		else
			printf("NOT BICOLORABLE.\n");
		while(!q.empty()) {

			q.pop();
		}
	}
	return 0;

}


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