二分图(1)--染色问题
来源:互联网 发布:火焰纹章 网络 编辑:程序博客网 时间:2024/06/04 00:43
题目大意:给定一个连通图,让你对它进行染色,总共黑白两种颜色,相邻两个节点不能是同一种颜色,问是否可以染
解析:
- 二分图:对于一个无向连通图,如果可以把所有点分成不相交的两部分,使所有边的起点和终点分别在两个部分内,称为二分图(即不能有边的起点和终点在一个部分内)
- 转化为本题即为不能有边的起点和终点是同一种颜色
如图
代码实现:
- 定义数组color[],1表示白色,2表示黑色,0表示未访问
- 用dfs,对于dfs(u),遍历它的所有v,如果有v访问过并且与他同色,返回false
- 对于未访问过的v,对他染色并dfs(v),如果dfs(v)不成功dfs(u)也不成功
#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;const int MAXN = 1000 + 10;int color[MAXN];int n, m;int head[MAXN], cnt;struct edge{ int to, next;} e[MAXN];void add(int u, int v){ e[++cnt].next = head[u]; head[u] = cnt; e[cnt].to = v;}bool erfen(int u){ for(int i = head[u]; i; i = e[i].next) { int v = e[i].to; if(color[u] == color[v]) return false; if(!color[v]) { color[v] = 3 - color[u]; if(!erfen(v)) return false; } } return true;}int main(){ cin >> n >> m; for(int i = 1; i <= m; i++) { int u, v; cin >> u >> v; add(u, v); add(v, u); } color[1] = 1; if(erfen(1)) cout << "YES"; else cout << "NO"; return 0;}
0 0
- 二分图(1)--染色问题
- 二分图染色问题
- 二分图判定(染色问题)
- NP-Hard Problem(二分图染色)
- HDU5971 Wrestling Match(二分图染色)
- 二分图染色模板
- 二分图染色
- 二分图染色模板
- 【模板】二分图染色
- Codeforce 85E (二分答案+二分图染色)
- [kuangbin带你飞]专题十 匹配问题 (二分图最大匹配)(二分图染色)(模板)
- zoj1462 二分图染色+DP
- uva10004 Bicoloring 二分图染色
- sgu172:eXam(二分图染色)
- 二分图判定(染色法)
- hdu 5285 二分图+染色
- 二分图+染色 poj 2492
- 二分图的判断--染色
- OpenCV学习笔记(1)opencv基本数据类型
- hdu1180 广搜
- Android上传文件到服务器
- OpenSSL Cookbook 4——自签证书
- Oracle 12c 安装及配置
- 二分图(1)--染色问题
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- 洛谷p2298 bfs
- 完美子串
- C++平时的线上练习题
- 直接插入排序法C#实现
- 深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
- 异常
- 【设计模式】——观察者