uva 交叉染色法10004

鉴于网上讲交叉染色的资料比较少,于是我把我自己的心得与方法贴出来,方便与大家共同进步。

二分图:

百度百科传送门

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.\n");
    else
        printf("NOT BICOLORABLE.\n");
 }
return 0;
}


posted @ 2014-07-19 16:55  HYDhyd  阅读(250)  评论(0编辑  收藏  举报