二分图(1)--染色问题
2017-05-14 21:38
225 查看
题目大意:给定一个连通图,让你对它进行染色,总共黑白两种颜色,相邻两个节点不能是同一种颜色,问是否可以染
解析:
二分图:对于一个无向连通图,如果可以把所有点分成不相交的两部分,使所有边的起点和终点分别在两个部分内,称为二分图(即不能有边的起点和终点在一个部分内)
转化为本题即为不能有边的起点和终点是同一种颜色
如图
代码实现:
定义数组color[],1表示白色,2表示黑色,0表示未访问
用dfs,对于dfs(u),遍历它的所有v,如果有v访问过并且与他同色,返回false
对于未访问过的v,对他染色并dfs(v),如果dfs(v)不成功dfs(u)也不成功
解析:
二分图:对于一个无向连通图,如果可以把所有点分成不相交的两部分,使所有边的起点和终点分别在两个部分内,称为二分图(即不能有边的起点和终点在一个部分内)
转化为本题即为不能有边的起点和终点是同一种颜色
如图
代码实现:
定义数组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; }
相关文章推荐
- 二分图染色问题
- 【网络流24题】骑士共存问题(二分图染色+最大权独立子集+最小割)
- 二分图判定(染色问题)
- [kuangbin带你飞]专题十 匹配问题 (二分图最大匹配)(二分图染色)(模板)
- 线段树--Color the ball(多次染色问题)
- UVA - 1627 Team them up!——二分图染色+01背包
- 洛谷P1330 封锁阳光大学(二分图染色)
- poj 2942 Knights of the Round Table 【无向图求BCC + 黑白染色判断二分图】
- 【lightoj1009 - Back to Underworld】二分图染色dfs
- UVA11080- Place the Guards-(二分图染色)-dfs
- POJ 1112 Team Them Up!【二分图染色+DP】
- 二分图最大匹配问题匈牙利算法
- 2007-2008 Winter Petrozavodsk Camp, Andrew Stankevich Contest 30-E - New Mayors - 二分图染色 (BFS+DFS)
- 洛谷 1330 封锁阳光大学 图论 二分图染色
- 洛谷 1330 封锁阳光大学 图论 二分图染色
- hdu 5285 wyh2000 and pupil 二分图染色发判定,求最大匹配
- 信与信封问题(二分图完美匹配变式)
- LightOJ1009-Back to Underworld -二分图染色
- HDU 1698 Just a Hook(线段树区间更新+区间求和+染色问题)
- Codeforces 557D - Vitaly and Cycle [二分图染色]【图论】