二分图判定

来源:互联网 发布:汉字笔顺查询软件 编辑:程序博客网 时间:2024/06/05 20:33

如果图中的点可以划分成两个集合使得集合内部的点之间没有边相连。
判定方法就是二色染色法,将一个点染成一种颜色,与之相邻的点染成另一种颜色,如果发现相邻两点颜色相同,则不是二分图,不存在则是二分图。
性质:二分图没有奇数环,存在奇数环就不是二分图。

#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();}
0 0