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