zoukankan      html  css  js  c++  java
  • 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("");
    }
  • 相关阅读:
    ftp的基本工作原理
    ubuntu自带输入法ibus 无法按数字键取词
    C语言教程
    【数据结构】---线性表
    python搭建opencv
    第六届Code+程序设计网络挑战赛
    整除分块
    ac自动机
    算法梳理 (CSP 2019
    lougu main page
  • 原文地址:https://www.cnblogs.com/00isok/p/10693487.html
Copyright © 2011-2022 走看看