无向图找奇数环,顺带更新边方向:
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
int n,m;
vector<pair<int,int> > e[maxn];
int color[maxn];
int ans[maxn];
bool res;
void dfs(int fa,int v,int d){
if(color[v] != 0){
if((d-color[v])%2) res = false;
return ;
}
color[v] = d;
for(int i=0;i<e[v].size();i++){
int u = e[v][i].first;
int ta = e[v][i].second;
if(u != fa){
if(d%2==0){
if(ta>0) ans[ta] = 0;
else ans[-1*ta] = 1;
}else{
if(ta>0) ans[ta] = 1;
else ans[-1*ta] = 0;
}
dfs(v,u,d+1);
}
}
}
void print(){
for(int i=1;i<=n;i++){
for(int j=0;j<e[i].size();j++){
printf("<%d %d> %d\n",i,e[i][j].first,e[i][j].second);
}
}
}
int main(){
res = true;
memset(ans,0,sizeof(ans));
memset(color,0,sizeof(color));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
e[a].push_back(make_pair(b,i));
e[b].push_back(make_pair(a,-1*i));
}
//print();
dfs(0,1,0); // down 0 ,up 1
if(res){
printf("YES\n");
for(int i=1;i<=m;i++){
printf("%d",ans[i]);
}
printf("\n");
}else{
printf("NO\n");
}
return 0;
}