文章目录
- 前言
- 代码
前言
就是欧拉路的板子
理解起来有亿点困难(连大神学长都还没有完全理解…)
不过背起来还是很好背的
请勿模仿
如果是无向图:开一个vis数组,走一条边时把它的反向边标记上即可
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+100;
const int mod=1e9+7;
const int p=131;
int n,m;
vector<int>e[N];
int in[N],out[N],s;
int zhan[N],top;
void dfs(int x){while(!e[x].empty()){int to=(*e[x].begin());e[x].erase(e[x].begin());dfs(to);}zhan[++top]=x;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);e[x].push_back(y);in[y]++;out[x]++;}int cnt=0;for(int i=1;i<=n;i++){sort(e[i].begin(),e[i].end());if(abs(in[i]-out[i])>1){printf("No");return 0;}else{if(out[i]==in[i]+1) s=i;}cnt+=in[i]!=out[i];}if(cnt!=0&&cnt!=2){printf("No");return 0;}if(s) dfs(s);else dfs(1);for(int i=top;i>=1;i--){printf("%d ",zhan[i]);}return 0;
}
/*
5 6
3 1
1 2
1 2
2 4
2 4
4 5
*/