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");
} 
posted @ 2026-03-11 17:25  peter_shen  阅读(9)  评论(0)    收藏  举报