Bicoloring |
Here you are asked to solve a simpler similar problem. You have to decide whether a given arbitrary connected graph can be bicolored. That is, if one can assign colors (from a palette of two) to the nodes in such a way that no two adjacent nodes have the same color. To simplify the problem you can assume:
An input with n = 0 will mark the end of the input and is not to be processed.
3 3 0 1 1 2 2 0 9 8 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0
NOT BICOLORABLE. BICOLORABLE.
背景是四色问题,需要解决的是二色问题,采用BFS不断地染色,遇到矛盾则推出否则一直把所有点染完色。
#include <stdio.h> int f,n,top,tail,queue[200],map[200][200],color[200]; //COLOR 0 不可染色 2可以染色 1已染上一种颜色 -1染上另一种颜色 int Bfs() {int point=queue[top],i; if (f==0) return 0; for (i=0;i<n;i++) if (map[point][i]==1) {if (color[i]==2) {++tail;queue[tail]=i;color[i]=-color[point];} else {if (color[i]==color[point]) f=0;} //遇到已经染色的点判断是否矛盾 } ++top; if (top<=n) Bfs(); return 0; }; int main() {int m,i,j,x,y; while (scanf("%d",&n),n) {for (i=0;i<n;i++) for (j=0;j<n;j++) map[i][j]=0; for (i=0;i<n;i++) color[i]=0; scanf("%d",&m); for (i=1;i<=m;i++) {scanf("%d%d",&x,&y); map[x][y]=1; map[y][x]=1; color[x]=2; color[y]=2; } top=1; tail=1; queue[1]=x; color[x]=1; f=1; Bfs(); if (f==1) printf("BICOLORABLE.\n"); else printf("NOT BICOLORABLE.\n"); } return 0; }