[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;
}