染色法判定二分图

思路

一:当图里有奇数边的环是该图不是二分图

二: 把所有点染上两种不同颜色,如果是二分图则两种颜色分配一定均匀

三: 染色过程中出现颜色冲突就不是二分图

四:每一个节点的连通的下一个节点与该节点颜色相反

五: 如果一个节点没有染色,就把他和他的所有连通点染色

染色法判定二分图_第1张图片

 

#include 
#include 
#include 

using namespace std;

const int N=10e5+10,M=2*N;

int h[N],e[M],ne[M],idx;
int st[N];
int n,m;

void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}

bool dfs(int x,int c)
{
    st[x]=c;
    for(int i=h[x];i!=-1;i=ne[i])
    {
        int t=e[i];
        if(!st[t])  {
            if(!dfs(t,3-c)) return false ;
        }
        else if(st[t]==c)return false ;
    }
    return true;
}


int main()
{
    cin>>n>>m;
    memset(h, -1, sizeof h);
    while (m -- ){
        
        int a,b;
        cin>>a>>b;
        add(a, b);
        add(b,a);
    }
    bool flag =true;
    for(int i=1;i<=n;i++)
    {
        if(!st[i])
        {
            if(!dfs(i,1))
            {
                flag=false;
                break;
            }
        }
    }
    if(flag) cout<<"Yes"<

 

你可能感兴趣的:(模板题,图论,c++,数据结构,算法,c语言)