染色法判断二分图

二分图:不存在奇数环也就是相邻两个点颜色不同就是二分图

给定一个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

##############################################################

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int N = 1e5+10, M = 2*1e5+10;
 5 int h[N], e[M], ne[M], idx;
 6 int color[N];//0 无色 1 2 各代表一种color
 7 int n, m;
 8 
 9 void add(int a, int b){
10     e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
11 }
12 
13 bool dfs(int u, int c){
14     color[u] = c;
15     for(int i = h[u];i != -1;i = ne[i]){
16         int t = e[i];
17         if(color[t] == c) return false;//染过但是和上一次染色同色
18         if(!color[t] && !dfs(t, 3 - c)) return false;
19     }
20     return true;//是二分图
21 }
22 
23 int main(){
24     memset(h, -1, sizeof h);
25     scanf("%d%d",&n, &m);
26     while(m--){
27         int a, b;
28         cin >> a >> b;
29         add(a, b); add(b, a);
30     }
31     bool flag = true;//代表不存在奇数环,也就是说这是一个二分图
32     for(int i = 1;i <= n;++i){
33         if(!color[i]){
34             if(!dfs(i, 1)){
35                 flag = false;
36                 break;
37             }
38         }
39     }
40     if(flag) cout << "Yes" << endl;
41     else cout << "No" << endl;
42     return 0;
43 }
View Code
原文地址:https://www.cnblogs.com/sxq-study/p/12238305.html