一:判断二分图
/**
题目:给定一个具有n个顶点的图,要给图上每个顶点染色,而且要使相邻的顶点的颜色不同。问是否能最多用两种颜色染色?题目保证没有重边和自环。
输入
3 3
0 1
1 2
0 2
输出
No
**/
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> G[100]; //图
int V,E; //顶点数
int color[100]={0}; //顶点i的颜色(1 or -1)
bool dfs(int v,int c){
color[v]=c;
for(int i=0;i<G[v].size();i++){
//如果相邻的顶点同色,则返回false
if(color[G[v][i]]==c){
return false;
}
//如果相相邻的顶点还没被染色,则染成-c
if(color[G[v][i]]==0&&!dfs(G[v][i],-c)){
return false;
}
}
//如果所有顶点都染过色了
return true;
}
void solve(){
for(int i=0;i<V;i++){
if(color[i]==0){
//如果顶点i还没被染色,则染成1
if(!dfs(i,1)){
printf("No\n");
return;
}
}
}
printf("Yes\n");
}
int main(){
int tempx,tempy;
scanf("%d%d",&V,&E);
for(int i=0;i<E;i++){
scanf("%d%d",&tempx,&tempy);
G[tempx].push_back(tempy);
G[tempy].push_back(tempx);
}
solve();
return 0;
}