Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)

Posted is_ok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)相关的知识,希望对你有一定的参考价值。

<题目链接>

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

解题分析:
因为定向后的图不能存在长度大于等于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("");
}

 

以上是关于Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 715B:Complete The Graph

[Codeforces 623A] Graph and String

codeforces 623A. Graph and String 构造

Codeforces 986C AND Graph dfs

Codeforces 459E Pashmak and Graph

CodeForces - 566F Clique in the Divisibility Graph