二分图染色
#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;
}