即有一个n个点m个边的无向图,判断是否为二分图。用染色法!
#include<bits/stdc++.h>
using namespace std;
//染色法判定二分图。二分图定义是当且仅当图中不存在奇数环
const int N=1e5+10,M=2e5+10; //为无向图
int idx,h[N],e[M],ne[M]; //用邻接表存储无向图
int n,m;
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) //简单dfs用染色法判定二分图,其实也可以用bfs。 u为点序号,c为颜色
{
color[u]=c; //初始化
for(int i=h[u];i!=-1;i=ne[i]) //图中点的遍历
{
int j=e[i];
if(!color[j]) //如果j未被染色
{
if(!dfs(j,3-c)) return false; //dfs 点j,用将其颜色设为3-c,就是与上一点不同的颜色,如果dfs返回false,则返回false
}
else if(color[j]==c) return false; //如果点j已经被染色,则如果点j与其上一点相同则返回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]) //如果i未被遍历
{
if(!dfs(i,1)) //则dfs遍历,若dfs返回值为false,则将哨兵flag,设为false;
{
flag=false;
break;
}
}
}
if(flag) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}