染色法判断二分图

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

给定一个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]) {
18             dfs(t, 3 - c);//没有被染过颜色,染色
19         }
20         else if(color[t] == c) return false;//染过但是和上一次染色同色
21     }
22     return true;//是二分图
23 }
24 
25 int main(){
26     memset(h, -1, sizeof h);
27     scanf("%d%d",&n, &m);
28     while(m--){
29         int a, b;
30         cin >> a >> b;
31         add(a, b); add(b, a);
32     }
33     bool flag = true;//代表不存在奇数环,也就是说这是一个二分图
34     for(int i = 1;i <= n;++i){
35         if(!color[i]){
36             if(!dfs(i, 1)){
37                 flag = false;
38                 break;
39             }
40         }
41     }
42     if(flag) cout << "Yes" << endl;
43     else cout << "No" << endl;
44     return 0;
45 }
View Code

猜你喜欢

转载自www.cnblogs.com/sxq-study/p/12238305.html
今日推荐