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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值