zoukankan      html  css  js  c++  java
  • 二分图判定--黑白染色

    首先,二分图又叫二部图,特点是所有点分成两半,每一半内的点之间没有边相连,只有两半之间会有边相连,图内无奇环,当然,单点图或者有单点的图也属于二分图,因此最主要的区分就是图内无奇环了。对于一个图,是否是二分图,常用的方法是黑白染色,由于给定图常常不完全连通,所以只要对于每一个还未标记过的点,从它开始DFS按照黑白相间的方法标记颜色(0/1),每次DFS操作就是将这一连通块内按黑白分成两半,若途中遇到需要然成某种颜色但已经标记为另一种颜色时,则表明出现了奇环,不能构成二分图。而要注意,每次DFS只是将一个连通块分成黑白两半,但不是同一次的DFS得到的黑白点之间并没有关系。

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 const int maxn=1e5+5;
     5 const int maxm=1e5+5;
     6 
     7 int head[maxn],point[maxm<<1],nxt[maxm<<1],size;
     8 int c[maxn];            //color,每个点的黑白属性,-1表示还没有标记,0/1表示黑白
     9 int num[2];                //在一次DFS中的黑白点个数
    10 bool f=0;                //判断是否出现奇环
    11 
    12 void init(){
    13     memset(head,-1,sizeof(head));
    14     size=0;
    15     memset(c,-1,sizeof(c));
    16 }
    17 
    18 void add(int a,int b){
    19     point[size]=b;
    20     nxt[size]=head[a];
    21     head[a]=size++;
    22     point[size]=a;
    23     nxt[size]=head[b];
    24     head[b]=size++;
    25 }
    26 
    27 void dfs(int s,int x){
    28     if(f)return;
    29     c[s]=x;
    30     num[x]++;
    31     for(int i=head[s];~i;i=nxt[i]){
    32         int j=point[i];
    33         if(c[j]==-1)dfs(j,!x);
    34         else if(c[j]==x){
    35             f=1;
    36             return;
    37         }
    38     }
    39 }
    40 //下面是主函数内的调用过程
    41 
    42 for(i=1;i<=n&&(!f);i++){
    43     if(c[i]==-1){
    44         num[0]=num[1]=0;
    45         dfs(i,1);
    46     }
    47 }
  • 相关阅读:
    centos7 升级 python3
    宿主机休眠后,虚拟机网络ping不通网关
    给微信群和朋友圈里发长视频的方法
    在word2019中使用latex
    anki2.1中使用latex,使用 MathJax 渲染latex格式的数学公式,化学公式
    如何用GoldWave批量删除mp3文件开头65秒?
    一款 CentOS-7 个性化配置脚本
    算法及算法分析
    博客园markdown使用LaTeX数学公式
    数据结构与算法
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4677703.html
Copyright © 2011-2022 走看看