[C++]二分图判定

[C++]二分图判定

二分图判定:
给定一个具有n个顶点的图。要给图上每个顶点染色,并且使相邻的顶点颜色不同。问是否能用2种颜色进行染色?题目保证没有重边和闭环。
输入格式:
顶点数n 边数m
m行边顶点到终点
输出格式:
Yes或No

输入:
3 3
0 1
0 2
1 2
输出:
No

输入:
4 4
0 1
0 3
1 2
2 3
输出:
Yes

解题思路:此题可用dfs遍历图,依次确认到达点是否填补颜色与种类。比起图染色问题,只用了2种颜色,那么一个点确认了颜色,则相邻的点颜色都确认了。

#include<iostream>
#include<vector>
using namespace std;

const int maxn = 1010;

vector<int> vec[maxn];
int n, m;
int color[maxn];

int dfs(int x, int c){
	color[x] = c;
	
	for(int i = 0; i<vec[x].size(); i++){
		if(color[vec[x][i]] == c) return false;  // 这一个点填补c颜色行不通 
		
		if(color[vec[x][i]] == 0 && !dfs(vec[x][i], -c)) return false;  // 下一个点填补-c颜色行不通 
	}
	
	return true; 
}

int main(){
	cin>>n>>m;

	for(int i = 0; i<m; i++){
		int a, b;
		
		cin>>a>>b;
		
		vec[a].push_back(b);
		vec[b].push_back(a);
	}
	
	for(int i = 0; i<n; i++){
		if(color[i] == 0){
			if(!dfs(i, 1)){
				cout<<"No"<<endl;
				return 0;
			}
		}
	}
	
	cout<<"Yes"<<endl;
		
	return 0;
}
发布了63 篇原创文章 · 获赞 8 · 访问量 7191

猜你喜欢

转载自blog.csdn.net/s1547156325/article/details/104593065