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