二分图:不存在奇数环也就是相邻两个点颜色不同就是二分图
给定一个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##############################################################

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 }
来源:https://www.cnblogs.com/sxq-study/p/12238305.html
