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" << "\n";
        for(int i = 0;i < m;i++){
            if(color[l[i]] > color[r[i]]) cout << 1;
            else cout << 0;
        }
    }
    else cout << "NO" << "\n";
    return 0;
}

posted @ 2020-10-06 22:52  Carered  阅读(120)  评论(0编辑  收藏  举报