染色法判定二分图

860. 染色法判定二分图

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

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

输入格式

第一行包含两个整数 \(n\)\(m\)

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

输出格式

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

数据范围

\(1≤n,m≤10^5\)

输入样例:

4 4
1 3
1 4
2 3
2 4

输出样例:

Yes

结论:一个图是二分图当且仅当该图不含奇数环

  • 时间复杂度:\(O(n+m)\)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,color[N];
vector<int> adj[N];
bool dfs(int x,int c)
{
    color[x]=c;
    for(int y:adj[x])
    {
        if(!color[y])
        {
            if(!dfs(y,3-c))return false;
        }
        else if(color[y]==c)return false;
    }
    return true;
}
int main()
{
    scanf("%d%d",&n,&m);
    while(m--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        adj[x].push_back(y),adj[y].push_back(x);
    }
    bool f=true;
    for(int i=1;i<=n;i++)
        if(!color[i])
            if(!dfs(i,1))
            {
                f=false;
                break;
            }
    puts(f?"Yes":"No");
    return 0;
}
posted @ 2021-11-26 20:39  zyy2001  阅读(37)  评论(0编辑  收藏  举报