二分图模板

判断是否为二分图模板:

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

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

输入格式

第一行包含两个整数n和m。

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

输出格式

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

数据范围

1≤n,m≤1051≤n,m≤105

输入样例:

4 4
1 3
1 4
2 3
2 4

输出样例:

Yes

 分析:

一个图如果是二分图等价于图中图存在奇数环,等价于染色过程总不存在矛盾。

代码:染色法判断是否为二分图

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N=100010,M=200010;

int h[N],e[M],ne[M],idx;

int color[N];
int n,m;

//添加边
int 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!=-1;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()
{
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    
    
    //如果染色的过程中出现矛盾则将标志变成false。
    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");
        
    return 0;
}
发布了22 篇原创文章 · 获赞 7 · 访问量 416

猜你喜欢

转载自blog.csdn.net/qq_40905284/article/details/104411260
今日推荐