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;
}