题目链接: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;
}