码迷,mamicode.com
首页 > 其他好文 > 详细

二分图判定--黑白染色

时间:2015-07-26 15:44:24      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

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

 1 int c[100005];        //color,每个点的黑白属性,-1表示还没有标记,0/1表示黑白
 2 int num[2];            //在一次DFS中的黑白点个数
 3 bool f=0;                //判断是否出现奇环
 4 
 5 void dfs(int a,int x){
 6     if(f)return;
 7     c[a]=x;
 8     num[x]++;
 9     for(int i=head[a];~i;i=nxt[i]){
10         int b=point[i];
11         if(c[b]==-1)dfs(b,!x);
12         else if(c[b]==x){
13             f=1;
14             return;
15         }
16     }
17 }
18 //下面是主函数内的调用过程
19 
20     for(i=1;i<=n&&(!f);i++){
21         if(c[i]==-1){
22             num[0]=num[1]=0;
23             dfs(i,1);
24 
25         }
26     }

 

二分图判定--黑白染色

标签:

原文地址:http://www.cnblogs.com/cenariusxz/p/4677703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!