算法思想:BFS给所有顶点染色,相邻顶点染不同颜色,染过的顶点检查与相邻顶点是否颜色不同。
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int N=1e4;
int color[N],graph[N][N];
bool bfs(int s,int n){
queue<int> q;
q.push(s);
color[s]=1;
while(!q.empty()){
int from=q.front();//取队头颜色,父结点
q.pop();
for(int i=1;i<=n;i++){//按层遍历
if(graph[from][i]&&color[i]==-1){
q.push(i);
color[i]=!color[from];//染与父结点不同的颜色
}
if(graph[from][i]&&color[from]==color[i]){//如果已经着色检查颜色是否相同
return false;
}
}
}
return true;
}
int main(){
int n,m,a,b,i;
memset(color,-1,sizeof(color));
cin>>n>>m;
for(i=0;i<m;i++){
cin>>a>>b;
graph[a][b]=graph[b][a]=1;
}
bool flag=false;
for(i=1;i<=n;i++){
if(color[i]==-1&&!bfs(i,n)){
flag=true;
break;
}
}
if(flag){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
}
return 0;
}