版权声明:欢迎转载,若转载,请标明出处,如有错误,请指点,也欢迎大佬们给出优化方法 https://blog.csdn.net/Charles_Zaqdt/article/details/88942403
题目链接:https://codeforces.com/contest/1144/problem/F
题意是n个点m条边,使这个无向图变为有向图,其实就是一个类似二分图染色的一个操作,dfs一下就好了
AC代码:
#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
int n,m;
int pre[maxn], a[maxn];
vector<int> v[maxn];
void dfs(int x){
for(int i=0;i<v[x].size();i++){
int to = v[x][i];
if(a[x] == a[to]){
puts("NO");
exit(0);
}
if(a[x] == -a[to]) continue;
a[to] = -a[x];
dfs(to);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int x, y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
pre[i] = x;
}
a[1] = 1;
dfs(1);
puts("YES");
for(int i=0;i<m;i++){
if(a[pre[i]] == 1) cout<<"1";
else cout<<"0";
}
puts("");
return 0;
}