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