给定一个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
一个图是二部图<=>这个图没有奇数环<=>这个图可以被两种颜色间染
dfs遍历邻接矩阵,如果出现相邻同色则返回false,注意无向图
#include<bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<n;i++) #define form(i,n) for(int i=1;i<=n;i++) const int SIZE=5010; const int N=2e5+20; const int M=2*N; typedef long long ll; int n,m,k; int e[N],h[N],cnt,to[N],col[M]; void add(int a,int b){ to[cnt]=h[a]; e[cnt]=b; h[a]=cnt++; } bool dfs(int x,int cl){ col[x]=cl; for(int i=h[x];i;i=to[i]){ int now=e[i]; if(!col[now]){ if(!dfs(now,3-cl))return false; } else if(col[now]==cl)return false; } return true; } int main(){ cin>>n>>m; int flag=0; form(i,m){ int a,b; cin>>a>>b; add(a,b); add(b,a); } for(int i=1;i<=n;i++){ if(!col[i]){ if(!dfs(i,1)){ flag=1; break; } } } if(flag)cout<<"No\n"; else cout<<"Yes\n"; }