博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分图判定--黑白染色
阅读量:6289 次
发布时间:2019-06-22

本文共 1313 字,大约阅读时间需要 4 分钟。

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

 

1 #include
2 #include
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 }

 

转载于:https://www.cnblogs.com/cenariusxz/p/4677703.html

你可能感兴趣的文章
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>