您的位置:首页 > 其它

2016-04-27 13:54 302 查看
二分图染色

#include <cstdio>
#include <vector>
using namespace std;
#define maxn 102
vector<int>G[maxn];
int color[maxn]; //顶点i的颜色(-1或1)
int V,E;
//把顶点染成1或者-1

bool dfs(int v,int c){ //顶点编号,颜色
color[v]=c; //把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)){
puts("No");
return;
}
}
}
printf("Yes\n");
}

int main(){
int s, t;
scanf("%d %d",&V,&E);
for(int i=0;i<E;i++){
//从s向t连
scanf("%d%d",&s,&t);
G[s].push_back(t);
G[t].push_back(s);
//如果无向图,再从t向s连
}
solve();
for(int i=0;i<V;i++)
printf("%d ",color[i]);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: