染色法判定二分图
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
using namespace std;
const int N=1e5+5;
int n,m,color[N];
vector 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;
}