1382: PIPI染色
BFS遍历节点,每次遍历一个节点的时候都去检验一下相连节点是否染色,若染色了,是否和自己不同
因为若一个图是二分图,那么所有点要么是黑色要么是白色,任意两个相同颜色的点在图中都一定是没有相连的
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
vector<int> mp[N];
int color[N]; //1´ú±í°×É«£¬-1´ú±íºÚÉ«£¬0´ú±íδȾɫ
bool flag=1;
void bfs(){
color[1]=1;
queue<int> que;
que.push(1);
while(!que.empty()){
int id=que.front();
// cout<<endl<<"id="<<id<<" color="<<color[id]<<endl;
que.pop();
for(int i=0;i<mp[id].size();i++){
// if(id==2,mp[id][i]==3){
// cout<<endl<<color[2]<<color[3]<<endl;
// }
// cout<<"mp[id][i]="<<mp[id][i]<<" color="<<color[mp[id][i]]<<endl;
if(color[mp[id][i]]!=color[id]){
if(color[mp[id][i]]==0){
color[mp[id][i]]=-color[id];
// cout<<"mp[id][i]="<<mp[id][i]<<" color="<<color[mp[id][i]]<<endl;
que.push(mp[id][i]); //»¹Ã»±»È¾É«µÄ½Úµã¼ÓÈë¶ÓÁÐ
}
}
else{
flag=0;
return;
}
}
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int s,t;
scanf("%d%d",&s,&t);
mp[s].push_back(t);
mp[t].push_back(s);
}
bfs();
if(flag){
printf("YES\n");
}
else
printf("NO\n");
}

浙公网安备 33010602011771号