#include <algorithm> #include <cctype> #include <cmath> #include <complex> #include <cstdio> #include <cstring> #include <deque> #include <functional> #include <list> #include <map> #include <iomanip> #include <iostream> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #define R register using namespace std; typedef long long ull; const int maxn = 5e3 + 100; inline int read() { int s = 0, w = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); } while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); } return s * w; } inline void write(int x) { if(x < 0) putchar('-'),x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0'); } vector <int> vec[maxn]; int ans[maxn], edge[maxn][2], t[maxn], vis[maxn]; int n, m, da, db, tsize = 0; inline void dfs(int x) { t[++tsize] = x; vis[x] = 1; int l = vec[x].size(); for (R int i = 0; i < l; ++i) { int y = vec[x][i]; if (!vis[y] && !((x == da && y == db) || (x == db && y == da))) //如果y点没有走过,且要走的边,不是删去的边 dfs(y); } return ; } inline void check() { if (tsize != n) return ; for (R int i = 1; i <= n; ++i) { if (t[i] != ans[i]) { if (t[i] > ans[i]) return ; break; } } for (R int i = 1; i <= n; ++i) { ans[i] = t[i]; } return ; } int main() { memset(ans, 0x3f, sizeof(ans)); n = read(), m = read(); for (R int i = 1; i <= m; ++i) { int a = read(), b = read(); vec[a].push_back(b); vec[b].push_back(a); edge[i][0] = a; edge[i][1] = b; } for (R int i = 1; i <= n; ++i) sort(vec[i].begin(), vec[i].end()); if (n > m) { da = -1, db = -1; dfs(1); check(); } else { for (R int i = 1; i <= m; ++i) { tsize = 0; da = edge[i][0]; db = edge[i][1]; memset(vis, 0, sizeof(vis)); dfs(1); check(); } } for (R int i = 1; i <= n-1; ++i) write(ans[i]), putchar(' '); write(ans[n]); return 0; } #include <algorithm> #include <iostream> #include <cstdio> #include <vector> using namespace std; const int N=5005; const int INF=0x7fffffff/2; vector<int> G[N]; vector<int> temp,ans; int du[N],cst,ced; int n,m,pt,vis[N],nxt[N]; int f[N],st; void Add(int x,int y) { G[x].push_back(y); } void Dfs(int x,int prt) { ans.push_back(x); for (int i=0;i<du[x];i++) { int y=G[x][i]; if (y==prt) continue; Dfs(y,x); } } void FindCircle(int x,int prt) { vis[x]=1; for (int i=0;i<du[x];i++) { int y=G[x][i]; if (y==prt) continue; if (vis[y]&&!pt) //如果y已访问过且从前未找到过环时 { nxt[x]=y; f[x]=1;//y在环上 pt=1; st=y;//环的开始点为y } else if (!vis[y]) { FindCircle(y,x); if (pt&&f[y]) //如果找到环且y在环上 { nxt[x]=y; f[x]=1; } } } if (x==st) pt=0; } void Dfs2(int x,int prt) { temp.push_back(x); for (int i=0;i<du[x];i++) { int y=G[x][i]; if (y==prt) continue; if ((x==cst&&y==ced)||(y==cst&&x==ced)) continue; Dfs2(y,x); } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); Add(u,v); Add(v,u); } for (int i=1;i<=n;i++) { sort(G[i].begin(),G[i].end()); du[i]=G[i].size(); } if (m==n-1) { Dfs(1,0); for (int i=0;i<n-1;i++) printf("%d ",ans[i]); printf("%d",ans[n-1]); } else { pt=0; FindCircle(1,0); int rt=st; for (int i=1;i<=n;i++) ans.push_back(INF); do { cst=rt; ced=nxt[rt]; temp.clear(); Dfs2(1,0); rt=nxt[rt]; if (ans>temp) ans=temp; } while (st!=rt); for (int i=0;i<n-1;i++) printf("%d ",ans[i]); printf("%d",ans[n-1]); } return 0; }