题目描述
给定一个 n个点 m条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。
输入格式
第一行包含两个整数 n和 m。
接下来 m 行,每行包含两个整数 u 和 v,表示点 u 和点 v 之间存在一条边。
输出格式
如果给定图是二分图,则输出 Yes,否则输出 No。
数据范围
1≤n,m≤105
输入样例:
4 4
1 3
1 4
2 3
2 4
输出样例:
Yes
尝试了一下使用BFS解决此题,需要的朋友可以参考一下
bfs
C++ 代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<unordered_map>
using namespace std;
const int N=2e5+9;
int n,m;
int e[N],ne[N],h[N],idx;//用邻接表储存图
int st[N];//是否染过色及染得1还是2
queue<int> q;
void Add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
bool Func(int u,int c){
st[u]=c;
q.push(u);
while(q.size()){
int t=q.front();//取队头,接下来访问该点的所有邻接点
q.pop();
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(!st[j]){
st[j]=3-st[t];
/*注意这里是3-st[t],dfs是3-c,由于dfs会进行递归,每次调用dfs函数只会执行对一个
点的邻接点的遍历,因此可以用3-c,bfs需要用每次队头的点的颜色号st[t] */
q.push(j);
}
else if(st[j]!=3-st[t])return false;
}
}
return true;
}
int main(){//main函数部分和DFS相同
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
Add(b,a);
Add(a,b);
}
for(int i=1;i<=n;i++){
if(!st[i]){
if(!Func(i,1)){
cout<<"No";
return 0;
}
}
}
cout<<"Yes";
return 0;
}