鉴于网上讲交叉染色的资料比较少,于是我把我自己的心得与方法贴出来,方便与大家共同进步。 二分图: 百度百科传送门 wiki百科传送门 判断一个图是否为二分图可以用交叉染色的方法来判断,可以用BFS,也可以用DFS,这里我用使用DFS来实现。 思路: 任意取一个点进行染色,如果发现要涂某一块时这个块已经被涂了色,并且与我们要使用的颜色不同的话,就说明这个图不能被染成BICOLORABLE的。 (1)如果没有染色,将它染色,并将它周围的点变成相反色。 (2)如果已经染色,判断是否与现在染色的点的颜色相同,相同,则退出,否则继续。 附上例题:UVA 10004 Bicoloring CODE #include<stdio.h> #include<string.h> #define N 300 int color[N],vis[N]; struct node { int u,v,next; }bian[N*N*2]; int head[N],yong; void addedge(int u,int v) { bian[yong].u=u; bian[yong].v=v; bian[yong].next=head[u]; head[u]=yong++; } int find(int u) { int i; for(i=head[u];i!=-1;i=bian[i].next) { int v=bian[i].v; if(!vis[v]) { vis[v]=1; color[v]=!color[u]; find(v); } else if(color[v]==color[u]) return 0; } return 1; } int main() { int n,m,a,b; while(scanf("%d",&n),n) { scanf("%d",&m); memset(head,-1,sizeof(head)); yong=0; memset(color,0,sizeof(color)); memset(vis,0,sizeof(vis)); while(m--) { scanf("%d%d",&a,&b); addedge(a,b); addedge(b,a); } color[0]=1; vis[0]=1; if(find(0)) printf("BICOLORABLE. "); else printf("NOT BICOLORABLE. "); } return 0; }