二分图判定
2016-07-29 19:49
316 查看
如果图中的点可以划分成两个集合使得集合内部的点之间没有边相连。
判定方法就是二色染色法,将一个点染成一种颜色,与之相邻的点染成另一种颜色,如果发现相邻两点颜色相同,则不是二分图,不存在则是二分图。
性质:二分图没有奇数环,存在奇数环就不是二分图。
判定方法就是二色染色法,将一个点染成一种颜色,与之相邻的点染成另一种颜色,如果发现相邻两点颜色相同,则不是二分图,不存在则是二分图。
性质:二分图没有奇数环,存在奇数环就不是二分图。
#include<bits/stdc++.h> using namespace std; const int maxn=1000; vector<int>nxt[maxn+5]; int vis[maxn+5]; bool dfs(int cur){ for(int i=0;i<nxt[cur].size();i++){ int x=nxt[cur][i]; if(vis[x]==-1){ vis[x]=!vis[cur];//染另一种颜色 if(dfs(x)==false)return false; }else if(vis[x]==vis[cur])return false;//颜色相同不是二分图 } return true; } int n; bool work(){ memset(vis,-1,sizeof(vis));//-1表示未染色 for(int i=1;i<=n;i++){ if(vis[i]==-1){ vis[i]=0;//不同连通分量的起点染上同一种颜色即可 if(dfs(i)==false)return false; } } return true; } int main(){ int m; cin>>n>>m;//n个点m条边无向图 while(m--){ int x,y; cin>>x>>y; nxt[x].push_back(y); nxt[y].push_back(x); } cout<<work(); }
相关文章推荐
- hd 2717 Catch That Cow
- 【代码笔记】HTML+CSS+JavaScript实现密码输入框显示文字
- Linux mint/Ubuntu 如何修改主机名(亲测有效)
- 后缀数组 poj 3261
- git 放弃本地修改 强制更新
- Squirrel: 通用SQL、NoSQL客户端
- sdut oj1252 进制转换(栈)
- HDU--1233最小生成树之kruskal算法
- 用c++编写一段完整代码,要求判断一个进程(例如qq.exe)是否存在,若存在,输出存在,不存在就输出不存在。
- 多项式求和
- SVD 详解 与 spark实战
- 当浏览器窗体改变时,div跟着变动方法
- Laravel 5.2中记录运行时 SQL
- 0728linux基础内容小记
- 文章标题
- 原生js实现随着滚动条滚动,导航会自动切换的效果
- tjut 4662
- 原生代码封装好的增删改查
- Spring AOP原理及拦截器
- <hdu - 1863> 畅通工程 并查集和最小生成树问题