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


  • 相关阅读:
    ny2 括号配对问题
    ny14 会场安排问题
    杭电ACM题目分类
    hdoj2037 今年暑假不AC
    ny37 回文字符串
    算法 字符串的排列组合
    手撸IoC
    Java设计模式
    多种方法求java求整数的位数
    二叉树之 二叉树深度
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410688.html
Copyright © 2020-2023  润新知