您的位置:首页 > 其它

二分图判定

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: