<题目链接>

题目大意:
给定一个无向图,该无向图不含自环,且无重边。现在要你将这个无向图定向,使得不存在任何一条路径长度大于等于2。然后根输入边的顺序,输出构造的有向图。如果构造的边与输入的方向一致,就输出1,方向不一致就输出0。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

解题分析:
因为定向后的图不能存在长度大于等于2的路径,所以我们直接对原图进行奇偶染色。如果碰到了奇环,就直接输出"NO",否则就对该图奇偶染色,进行地定向。$col[u]$表示以$u$为起点的边所染的颜色。

#include <bits/stdc++.h>
using namespace std;

#define pb push_back
const int N = 2e5+5;

template<typename T>
inline void read(T&x){
    x=0;int f=1;char c=getchar();
    while(c<'0' || c>'9'){ if(c=='-')f=-1;c=getchar(); }
    while(c>='0' && c<='9'){ x=x*10+c-'0';c=getchar(); }
    x*=f;
}
int n,m;
int vis[N],col[N];
vector<int>G[N],index;
bool ok=true;

void dfs(int u,int cur){
    col[u]=cur;
    vis[u]=1;
    for(auto v:G[u]){
        if(col[v] && col[u]==col[v]) ok=false;    //出现冲突
        if(!vis[v]){
            if(cur&1)dfs(v,2);
            else dfs(v,1);
        }
    }
}
int main(){
    read(n);read(m);
    for(int i=1;i<=m;i++){
        int u,v;read(u);read(v);
        G[u].pb(v);G[v].pb(u);
        index.pb(u);     //记录下第i条边的起点
    }
    dfs(1,1);
    if(!ok)return puts("NO"),0;
    puts("YES");
    for(auto u:index){
        printf("%d",col[u]-1);
    }puts("");
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄