图论——二分图1:二分图以及判定
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图论——⼆分图1:⼆分图以及判定
图,有有向图,⽆向图,稠密图,简单图······
算法,有贪⼼法,⼆分法,模拟法,倍增法······
那,⼆分图是啥?
⼆分法+有向图?
于是,我查了许多资料,才对它有⼀定了解。
⼆分图:⼆分图,是图论中的⼀种特殊模型,设G=(V,E)是⼀个⽆向图,如果顶点V可分割为两个互不相交的⼦集(A,B),并且同⼀集合中不同的两点没有边相连。
这就是⼆分图。
举个栗⼦吧:
这是不是⼆分图?
反正我第⼀次看觉得不是
其实,是的,他是⼆分图,尽管看上去是连着的。
若我们将图中的⼀些边转⼀下,变成:
这就是⼀个明显的⼆分图。
集合A与B中的点互不相连。
因此,在⼿动判定⼆分图时学会转边!
辣魔,⼆分图要⽤计算机判定怎么实现?
数竞⼤佬:简单!
!!!染⾊⼤法!!!
有没有熟悉的感觉
0表⽰还未访问,1表⽰在集合A中,2表⽰在集合B中。
col(color)储存颜⾊。
初始化为0.
上代码:
其实是模板
可以记忆。
1 vector <int> v[N];
2void dfs(int x,int y){
3 col[x]=y;
4for (int i=0; i<v[x].size(); i++) {
5if (!col[v[x][i]]) dfs(v[x][i],3-y);
6if (col[v[x][i]]==col[x]) FLAG=true; //产⽣了冲突
7 }
8 }
9for (i=1; i<=n; i++) col[i]=0; //初始化
10for (i=1; i<=n; i++) if (!col[i]) dfs(i,1); //dfs染⾊
11if (FLAG) cout<<"NO"; else cout<<"YES";
下⼀章我们将讲到⼆分图的匹配,我们明天见。