zoukankan      html  css  js  c++  java
  • 二分图的判断——染色法

    染色法判断二分图

    二分图:

    一个无向图,使得顶点集V可以分割为两个互不相交的子集A,B,使得所有边两端分别属于两个子集A,B。

    度娘的解释。

    要判断二分图,要分两种情况,一种是联通图,一种是非连通图,两者都不难。

    大致思路就是先找到一个没被染色的节点u,把它染上一种颜色,之后遍历所有与它相连的节点v,如果节点v已被染色并且颜色和节点u一样,那么就失败了。如果这个节点v没有被染色,先把它染成与节点u不同颜色的颜色,然后遍历所有与节点v相连的节点............就这样循环下去,直到结束为止。

    连通图代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define N 42000
     4 int next[N],to[N],num,head[N],col[N],flag,n,m,a,b;
     5 void add(int false_from,int false_to){
     6     next[++num]=head[false_from];
     7     to[num]=false_to;
     8     head[false_from]=num;
     9 }
    10 void dfs(int x,int color){
    11     col[x]=color;
    12     for(int i=head[x];i;i=next[i]){
    13         if(col[to[i]]==col[x]){
    14             printf("NO");
    15             flag=1;
    16             exit(0);
    17         }
    18         if(!col[to[i]])
    19             dfs(to[i],-color);
    20     }
    21 }
    22 int main(){
    23     scanf("%d%d",&n,&m);
    24     for(int i=1;i<=m;++i){
    25         scanf("%d%d",&a,&b);
    26         add(a,b);
    27         add(b,a);
    28     }
    29     dfs(1,1);
    30     if(!flag)
    31         printf("YES");
    32     return 0;
    33 }
    View Code

    非连通图代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define N 42000
     4 int next[N],to[N],num,head[N],col[N],flag,n,m,a,b;
     5 void add(int false_from,int false_to){
     6     next[++num]=head[false_from];
     7     to[num]=false_to;
     8     head[false_from]=num;
     9 }
    10 void dfs(int x,int color){
    11     col[x]=color;
    12     for(int i=head[x];i;i=next[i]){
    13         if(col[to[i]]==col[x]){
    14             printf("NO");
    15             flag=1;
    16             exit(0);
    17         }
    18         if(!col[to[i]])
    19             dfs(to[i],-color);
    20     }
    21 }
    22 int main(){
    23     scanf("%d%d",&n,&m);
    24     for(int i=1;i<=m;++i){
    25         scanf("%d%d",&a,&b);
    26         add(a,b);
    27         add(b,a);
    28     }
    29     for(int i=1;i<=n&&!flag;++i)
    30         if(!col[i])
    31             dfs(i,1);
    32     if(!flag)
    33         printf("YES");
    34     return 0;
    35 }
    View Code

    后记:本来都搞过这东西了,然而培训时听某清北奆佬讲到这,以为要搞更diao的东西,于是一激动就把原来那篇给删了,尽管补一篇不难,但是.........................................................

  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/jsawz/p/6847185.html
Copyright © 2011-2022 走看看