$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. 对每个点进行染色
2. 枚举该点的所有出边到达的点,染上不一样的颜色
3. 如果存在奇数环,就不存在二分图
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010, M = 200010;
int n,m;
int h[N],e[M],ne[M],idx;
int color[N];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
//查看是否有奇数环
bool dfs(int u,int c)
{
//对该点进行染色
color[u]=c;
//枚举该点的所有出边
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
//没有染色
if(!color[j])
{
if(!dfs(j,3-c)) return false;
}
//染色了但不符合条件
else if(color[j]==c) return false;
}
return true;
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h);
//建立邻接表,无向图要建两条边
while(m--)
{
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
//对每个点进行染色
bool flag=true;
for(int i=1;i<=n;i++)
if(!color[i]&&!dfs(i,1))
flag=false;
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}