rt,调了很久不知道哪里错了,写的很依托,求 dalao看看(
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + 10;
int n, m, vis[MAXN], u, v, edcnt, ring[MAXN], tot, fg, fa[MAXN], tmp[MAXN], pd[MAXN], mx[MAXN], subt1[MAXN], subt2[MAXN], ed[MAXN];
vector <int> t[MAXN], rt[MAXN];
void dfs1(int u, int f){
if(fg)return;
vis[u] = 1;
fa[u] = f;
int len = t[u].size();
for(int i = 0; i < len && !fg; i++){
if(fg)return;
int v = t[u][i];
if(v == f)continue;
if(vis[v]){
ring[++tot] = v;
pd[v] = 1;
while(u != v){
pd[u] = 1;
ring[++tot] = u;
u = fa[u];
}
fg = 1;
return;
}
dfs1(v, u);
}
}
void dfs2(int u, int f, int x, int y){
ed[++edcnt] = u;
int len = t[u].size();
for(int i = 0; i < len; i++){
int v = t[u][i];
if(v == f || (u == x && v == y) || (u == y && v == x))
continue;
dfs2(v, u, x, y);
}
}
int main(){
// freopen("travelsss.txt", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
int u, v;
scanf("%d %d", &u, &v);
t[u].push_back(v);
t[v].push_back(u);
}
dfs1(1, 0);
for(int i = 1; i <= n; i++)
sort(t[i].begin(), t[i].end());
int j;
ring[++tot] = ring[1];
for(int i = 1; i <= tot; i++)
tmp[i] = ring[tot - i + 1];
for(int i = 1; i <= tot; i++)
ring[i] = tmp[i];// cout << ring[i] << ' ';
// puts("");
for(int i = 2; i < tot; i++){
int len = t[ring[i]].size();
for(int j = 0; j < len; j++){
int v = t[ring[i]][j];
if(v == fa[ring[i]] || pd[v])
continue;
rt[i].push_back(v);
mx[i] = max(mx[i], v);
}
// cout << ring[i] << ':' << mx[i] << ' ';
sort(rt[i].begin(), rt[i].end());
}
// puts("");
for(int i = 3; i < tot; i++){
if(t[ring[i - 1]].size() > 2)
subt1[i] = i - 1;
else
subt1[i] = subt1[i - 1];
}
if(t[ring[1]].size() > 3)
subt1[2] = subt2[tot - 1] = 1;
for(int i = tot - 2; i >= 2; i--){
if(t[ring[i + 1]].size() > 2)
subt2[i] = i + 1;
else
subt2[i] = subt2[i + 1];
}
if(ring[2] > ring[tot - 1]){
for(j = tot - 1; j > 2; j--){
int nxt = ring[j - 1];
// cout << nxt << ' ' << mx[j] << '\n';
if(nxt < mx[j] || nxt < ring[2])
continue;
if(subt2[j]){
int ct = lower_bound(rt[subt2[j]].begin(), rt[subt2[j]].end(), nxt) - rt[subt2[j]].begin();
if(ct == rt[subt2[j]].size()){
u = ring[j], v = ring[j - 1];
break;
}
continue;
}
u = ring[j];
v = ring[j - 1];
break;
}
if(!u)
u = ring[2], v = ring[1];
}
else{
for(j = 2; j < tot - 1; j++){
int nxt = ring[j + 1];
// cout << nxt << ' ' << mx[j] << '\n';
if(nxt < mx[j] || nxt < ring[tot - 1])
continue;
if(subt1[j]){
int ct = lower_bound(rt[subt1[j]].begin(), rt[subt1[j]].end(), nxt) - rt[subt1[j]].begin();
if(ct == rt[subt1[j]].size()){
u = ring[j], v = ring[j + 1];
break;
}
continue;
}
u = ring[j];
v = ring[j + 1];
break;
}
if(!u)
u = ring[tot - 1], v = ring[1];
}
// return 0;
if(m == n - 1)
dfs2(1, 0, 0, 0);
else dfs2(1, 0, u, v);
for(int i = 1; i <= n; i++)
printf("%d ", ed[i]);
return 0;
}