码迷,mamicode.com
首页 > 其他好文 > 详细

染色法判定二分图

时间:2020-07-15 01:04:50      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:数据   sub   ssis   mes   false   范围   form   遍历   data   

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

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

输入格式

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

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

输出格式

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

数据范围

1n,m1051≤n,m≤105

输入样例:

4 4
1 3
1 4
2 3
2 4

输出样例:

Yes
一个图是二部图<=>这个图没有奇数环<=>这个图可以被两种颜色间染
dfs遍历邻接矩阵,如果出现相邻同色则返回false,注意无向图
#include<bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0;i<n;i++)
#define form(i,n) for(int i=1;i<=n;i++)
const int SIZE=5010;
const int N=2e5+20;
const int M=2*N;
typedef long long ll;
int n,m,k;
int e[N],h[N],cnt,to[N],col[M];
void add(int a,int b){
    to[cnt]=h[a];
    e[cnt]=b;
    h[a]=cnt++;
}
bool dfs(int x,int cl){
    col[x]=cl;
    for(int i=h[x];i;i=to[i]){
        int now=e[i];
        if(!col[now]){
            if(!dfs(now,3-cl))return false;
        } else if(col[now]==cl)return false;
    }
    return true;
}
int main(){
    cin>>n>>m;
    int flag=0;
    form(i,m){
        int a,b;
        cin>>a>>b;
        add(a,b);
        add(b,a);
    }
    for(int i=1;i<=n;i++){
        if(!col[i]){
            if(!dfs(i,1)){
                flag=1;
                break;
            }
        }
    }
    if(flag)cout<<"No\n";
    else cout<<"Yes\n";
}

 



染色法判定二分图

标签:数据   sub   ssis   mes   false   范围   form   遍历   data   

原文地址:https://www.cnblogs.com/ilikeeatfish/p/13303242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!