题目链接
题面
题目大意
给n个点,m条边,是否存可以将m条边按 ‘0‘ 或 ’1‘ 来标注边的方向,使图中不存在长度超过1的路径。若存在,输出 ”YES“ 并按序输出边的方向。
题目分析
相当于使用两个颜色给点染色,相邻的点颜色不同。dfs搜索一下就可以了,若碰到两个点有边且颜色相同,即不可以。最后输出m条边的 ui 的颜色即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
vector<vector<int> > vec;
struct edge{int from,to;}num[200010];
int vis[200010],n,ans=1;
void dfs(int x,int col,int cnt){
if(cnt==n){
return;
}
for(int i=0;i<vec[x].size();i++){
if(vis[vec[x][i]]==0){
if(col==1){
vis[vec[x][i]]=2;
dfs(vec[x][i],2,cnt+1);
}
else{
vis[vec[x][i]]=1;
dfs(vec[x][i],1,cnt+1);
}
}
else if(vis[vec[x][i]]==col){
ans=0;
return;
}
}
}
int main()
{
int m,flag=1;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++){
vector<int> a;
vec.push_back(a);
}
for(int i=0;i<m;i++){
scanf("%d%d",&num[i].from,&num[i].to);
vec[num[i].from].push_back(num[i].to);
vec[num[i].to].push_back(num[i].from);
}
vis[num[0].from]=1;
dfs(num[0].from,1,1);
if(ans){
printf("YES\n");
for(int i=0;i<m;i++){
printf("%d",vis[num[i].from]-1);
}
}
else printf("NO\n");
return 0;
}