zoukankan      html  css  js  c++  java
  • CodeForce 1144 F. Graph Without Long Directed Paths

    题目链接

    https://codeforces.com/contest/1144/problem/F

    题意

    给你一个无向图,把所有边标记方向,并使整张图中没有距离 (>=2) 的路径,问你是否存在并输出方案。第一行输出“YES”或“NO”,若存在,第二行按照读入顺序输出连边方向。

    思路

    很容易发现一个点要么没有出度要么没有入度,所以假设只有出度的点设为白色,只有入度的点设为黑色,显然任意俩个白色或者黑色点不相邻,那么跑一遍二分图染色,最后输出白色点指向黑色点就行(反过来也可以)。

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 2e5 + 50;
    int n, m;
    int l[maxn], r[maxn];
    int color[maxn];
    vector<int> G[maxn];
    bool dfs(int v, int c){
        color[v] = c;
        for(int i = 0;i < G[v].size();i++){
            int u = G[v][i];
            if(color[u] == c) return false;
            if(color[u] == 0 && !dfs(u , -c)) return false;
        }
        return true;
    }
    bool check(){
       memset(color, 0, sizeof(color));
       for(int i = 1;i <= n;i++){
            if(color[i] == 0 && !dfs(i, 1)) return false;
       }
       return true;
    }
    int main()
    {
        std::ios::sync_with_stdio(false);
        cin >> n >> m;
        for(int i = 0;i < m;i++){
            cin >> l[i] >> r[i];
            G[l[i]].push_back(r[i]);
            G[r[i]].push_back(l[i]);
        }
        if(check()){
            cout << "YES" << "
    ";
            for(int i = 0;i < m;i++){
                if(color[l[i]] > color[r[i]]) cout << 1;
                else cout << 0;
            }
        }
        else cout << "NO" << "
    ";
        return 0;
    }
    
    
  • 相关阅读:
    cocoapods使用遇到的一些问题
    so
    UITextField的各种属性方法介绍
    <<第1章 初识JAVA>>
    《第16章 复习》
    《第17章 图书管理系统》
    《第15章 字符串》
    《第13章 猜拳游戏》
    《第14章 带参数的方法》
    《第12章 类的无参方法》
  • 原文地址:https://www.cnblogs.com/Carered/p/13775866.html
Copyright © 2011-2022 走看看