二分图的判断 bfs+dfs两种搜索方法判断
来源:互联网 发布:linux 卸载u盘 编辑:程序博客网 时间:2024/04/30 11:14
二分图的定义是:给定一个具有n个顶点的图,要给每个顶点上色,并且使相邻的顶点颜色不相同。是否能用最多两种颜色进行染色?
首先我们用邻接矩阵来模拟图,使用bfs对整个图遍历一遍
#include <iostream>#include <queue>#include <cstring>using namespace std;const int MAX_N = 105;int V, E;// 代表点的颜色,初始化为0,1或-1表示两种不同的颜色int color[MAX_N];// 使用邻接矩阵来模拟图int G[MAX_N][MAX_N];bool bfs(int s){ color[s] = 1; queue<int> que; que.push(s); while(!que.empty()) { int from = que.front(); que.pop(); for(int i = 1; i <= V; i++) { // 如果相邻的点没有上色就给这个点上色 if(G[from][i] && color[i] == 0) { que.push(i); color[i] = -color[from]; } // 如果相邻的颜色相同则返回false if(G[from][i] && color[i] == color[from]) return false; } } // 如果所有的点都被染过色,且相邻的点颜色都不一样,返回true return true;}int main(){ // V代表有几个点,E代表有几条边 cin >> V >> E; for(int i = 0; i < E; i++) { int s, t; cin >> s >> t; G[s][t] = G[t][s] = 1; } bool flag = false; // 初始化color数组 memset(color, 0, sizeof(color)); for(int i = 1; i <= V; i++) { if(color[i] == 0 && !bfs(i)) { flag = true; break; } } if(flag) cout << "No" << endl; else cout << "Yes" << endl; return 0;}下面是使用邻接表来模拟图,然后使用dfs来搜索整张图:
// 一个简单的二分图的判断#include <iostream>#include <vector>#include <cstring>using namespace std;const int MAX_N =105;int V,E;// 使用邻接表模拟一张无向图vector<int> G[MAX_N];// 顶点的颜色,初始化为0,上色有两种颜色(0 or 1)int color[MAX_N];bool dfs(int v, int c){ color[v] = c; // 把顶点染成c for(int i = 0; i < G[v].size(); i++) { // 如果当前点的相邻的点同色就返回false if(color[G[v][i]] == c) return false; // 如果当前点的邻点还没被染色,就染成-c if(color[G[v][i]] == 0 && !dfs(G[v][i], -c)) return false; } // 如果当前点都被染过色,就返回true return true;}void solve(){ for(int i = 0; i < V; i++) { if(color[i] == 0) { if(!dfs(i,1)) { cout << "no" << endl; return; } } } cout << "yes" << endl;}int main(){ cin >> V >> E; for(int i = 0; i < E; i++) { int s, t; cin >> s >> t; G[s].push_back(t); G[t].push_back(s); // 如果有向图则无需这一句 } memset(color, 0, sizeof(color)); solve(); return 0;}
1 0
- 二分图的判断 bfs+dfs两种搜索方法判断
- BFS/DFS 判断是否是二分图
- 判断二分图 bfs
- 【图】BFS遍历、DFS遍历、Topology排序、判断二分性
- EOJ 1816 判断图连通的三种方法——dfs,bfs,并查集
- 二分图判断 (图的搜索)
- HDU2444 二分图判断(BFS 的染色法) + 求最大匹配边数(DFS 的匈牙利算法)
- 【BFS、二分图判断】二部图NYOJ1015
- 判断ie的两种方法
- 素数 的两种判断方法
- 井字棋判断输赢的两种方法
- Java闰年的判断 两种方法
- 二分图的判断
- 二分图的判断
- 通过BFS 和 DFS两种方法找无向图的连通分量
- 二分图的判定模板(dfs,bfs)
- 二分图匹配匈牙利算法(DFS, BFS两种实现模板)
- js实现二分搜索的两种方法
- [cqoi2015]选数 解题报告
- GooglePlay内购In-app Billing 总结~
- 关于检测输入正误的提示的研究
- 各种浏览器全屏模式的方法、属性和事件介绍(转)
- Linux 开发工具学习(gcc 、gdb和makefile)
- 二分图的判断 bfs+dfs两种搜索方法判断
- NASM/MASM
- 怎么查看oracle数据库数据量大小?
- javaScript日期对象格式化
- MFC CStatic 透明重绘 使用双缓冲
- IOS开发 - 网络总结(二)
- MFC中自定义类访问主对话框控件
- 关于ajax的跨域问题
- MySQL备份之mysqlpump工具备份故障一则案例分享