染色法判断二分图

给定一个 n 个点 m 条边的无向图,图中可能存在重边和自环。

请你判断这个图是否是二分图。

输入格式
第一行包含两个整数 n 和 m。

接下来 m 行,每行包含两个整数 u 和 v,表示点 u 和点 v 之间存在一条边。

输出格式
如果给定图是二分图,则输出 Yes,否则输出 No。

数据范围
1≤n,m≤105
输入样例:
4 4
1 3
1 4
2 3
2 4
输出样例:
Yes

代码

//O(nm)
#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=200010;
int n,m,e[M],ne[M],h[M],idx;
int color[N];
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
bool dfs(int u,int c)
{
    color[u]=c;
    for(int i=h[u];~i;i=ne[i])
    {
        int j=e[i];
        if(!color[j])
        {
            if(!dfs(j,3-c))
            return false;
        }
        else
        if(color[j]==c)return false;

    }
    return true;
}
int main()
{
  //ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
    cin>>n>>m;
    memset(h,-1,sizeof h);
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    bool flag=true;
    for(int i=1;i<=n;i++)
        if(!color[i])
        {
            if(!dfs(i,1))
            {
            flag=false;
            break;
            }
        }
    if(flag)
    puts("Yes");
    else
    puts("No");
    system("pause");
    return 0;
}
posted @ 2022-02-09 23:40  Avarice_Zhao  阅读(40)  评论(0)    收藏  举报