题目链接:http://codeforces.com/contest/1144/problem/F
题目大意:给你n个点m条边的无向连通图,请你给每个边附一个方向,令图中没有长度>=2的边出现。
思路:一个点开始染色 和他相连的点染相反颜色 然后再继续递归下去染色,判断下一节点的颜色和自己的一样不,一样就输出NO,反之能满足题意。
1表示与自己相连的边指向自己。在处理边的方向,是一个非常好的技巧。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
vector<int> e[200005];
int a[200005], b[200005], vis[200005]={0};
int f=1;
void dfs(int fa, int u, int x){
vis[u]=x;
for(int i=0; i<e[u].size(); i++){
int v=e[u][i];
if(v==fa){//父节点
continue;
}
else if(!vis[v]){//没有染色
dfs(u, v, -x);
}
else if(vis[v]==vis[u]){//染色冲突
f=0;
}
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++){
scanf("%d%d", &a[i], &b[i]);
e[a[i]].push_back(b[i]);
e[b[i]].push_back(a[i]);
}
dfs(-1, 1, 1);
if(f==0){
printf("NO\n");
}
else{
printf("YES\n");
for(int i=1; i<=m; i++){
if(vis[a[i]]==1){
printf("1");
}
else{
printf("0");
}
}
}
return 0;
}