判断二分图——染色法
来源:互联网 发布:java不关闭流 编辑:程序博客网 时间:2024/05/17 22:11
怎么判定一个图是否为二分图
从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用bfs遍历即可。代码:
#include <queue> #include <cstring> #include <iostream> using namespace std; const int N = 999; int col[N], Map[N][N]; //0为白色,1为黑色 bool BFS(int s, int n) { queue<int> p; p.push(s); col[s] = 1; //将搜索起始点涂成黑色 while(!p.empty()) { int from = p.front(); p.pop(); for(int i = 1; i <= n; i++) { if(Map[from][i] && col[i] == -1) //如果从from到i的边存在(为邻接点) && i点未着色 { p.push(i); //将i点加入队列 col[i] = !col[from];//将i点染成不同的颜色 } if(Map[from][i] && col[from] == col[i])//如果从from到i的边存在(为邻接点) && i点和from点这一对邻接点颜色相同,则不是二分图 return false; } } return true; //搜索完s点和所有点的关系,并将邻接点着色,且邻接点未发现相同色则返回true } int main() { int n, m, a, b; memset(col, -1, sizeof(col)); cin >> n >> m; //n 为有多少点,m为有多少边 for(int i = 0; i < m; i++) { cin >> a >> b; Map[a][b] = Map[b][a] = 1; } bool flag = false; for(i = 1; i <= n; i++) //遍历并搜索各个连通分支 { if(col[i] == -1 && !BFS(i, n)) //每次找没有着色的点进行判断,如果从它开始BFS发现相同色邻接点则不是二分图 { flag = true; break; } } if(flag) cout << "NO" <<endl; else cout << "YES" <<endl; return 0; }
0 0
- 判断二分图——染色法
- 交叉染色法判断二分图
- 判断是否为二分图 染色法
- hdu 5285(染色法判断二分图)
- hdu 4751 染色法判断二分图
- 判断二分图 染色法 NYOJ 1015
- 二分图的判断--染色
- NYOJ1015 二部图(染色法判断二分图)
- hdu 2444(染色法判断二分图+匈牙利算法)
- hdu 2444(染色法判断二分图+匈牙利算法)
- HDU 5285 wyh2000 and pupil(染色法判断二分图)
- 南阳理工1015 (染色法判断二分图)
- 南阳理工1015 (染色法判断二分图)
- poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图
- HDU 4751 交叉染色判断二分图
- hdu4751Divide Groups(二分图染色判断)
- 二分图判定(染色法)
- HDU-2444-The Accomodation of Students [二分匹配][判断二分图][BFS染色法]
- 数据库的隔离级别
- 字符串和数字之间的转换
- 杭电1013
- uImage在内存中无法正常启动——UBoot-2010.06在TQ2440上的移植--机器码配对
- DBUtil连接池
- 判断二分图——染色法
- java 集合框架
- 【Codeforces 678E】【JZOJ 4648】锦标赛
- SPI flash debug trace
- js基础汇总
- 283. Move Zeroes
- 两个链表的第一个公共结点 java
- leetcode 197. Rising Temperature
- 编译时的注解编写