[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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章