社区讨论
76 pts 求调
P5049[NOIP 2018 提高组] 旅行 加强版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj1hxvuj
- 此快照首次捕获于
- 2025/12/11 21:51 2 个月前
- 此快照最后确认于
- 2025/12/12 17:36 2 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i,a,b) for(int i=(a),E##i=(b);i<=E##i;i++)
#define REV(i,a,b) for(int i=(a),E##i=(b);i>=E##i;i--)
#define CLOSE_TIE ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define psbk push_back
#define endl '\n'
template <typename T>
void _outval(string s,int p,const T &t) {cout<<s.substr(p,s.length()-p)<<'='<<t<<endl; }
template <typename T, typename... Args>
void _outval(string s,int p,const T &t,const Args &...rest){
string n="";
while(s[p]!=',') n+=s[p++];
cout<<n<<'='<<t<<", ";
_outval(s,p+1,rest...);
}
#define outval(...) _outval(#__VA_ARGS__,0,__VA_ARGS__)
#define outarr(a,be,ed)\
{cout<<(#a)<<": ";\
FOR(iiii,be,ed)cout<<'['<<iiii<<"]="<<a[iiii]<<(iiii<ed?", ":"\n");}
const int N=5e5+5;
int n,m,vis[N],mp[N],fa[N],be;
bool fl=1,bk[N];
struct Edge{int v,id;};
vector<Edge> e[N];
vector<int> ans,c;
void dfs1(int u,int lst){
if(fl) ans.psbk(u);
vis[u]=1;
for(Edge ed:e[u]){
int v=ed.v,id=ed.id;
if(id==lst) continue;
if(!vis[v]) fa[v]=u,dfs1(v,id);
else if(vis[v]==1){
int now;
for(now=u;now!=v;now=fa[now]){
c.psbk(now); vis[now]=2;
}
c.psbk(now); vis[now]=2; fl=0;
while(ans.back()!=now) ans.pop_back();
}
}
}
void dfs2(int u,int num){
if(mp[u]!=1) ans.psbk(u);
//outval(u,num,mp[u],ans.back());
mp[u]=1;
for(Edge ed:e[u]){
int v=ed.v;
if(!mp[v]&&v<num) dfs2(v,N);
}
}
void dfs3(int u,int lst){
//outval(u,lst);
if(!mp[u]) ans.psbk(u);
mp[u]=1;
for(Edge ed:e[u]){
int v=ed.v,id=ed.id;
if(id==lst||v==c[be]) continue;
dfs3(v,id);
}
}
int calc(int u){
int mn=N;
for(Edge ed:e[u])
if(!mp[ed.v]) mn=min(mn,ed.v);
return mn==N?0:mn;
}
int main(){
//freopen("in.txt","r",stdin);
CLOSE_TIE
cin>>n>>m;
FOR(i,1,m){
int u,v; cin>>u>>v;
e[u].psbk({v,i}),e[v].psbk({u,i});
}
FOR(i,1,n) sort(e[i].begin(),e[i].end(),[&](Edge a,Edge b){return a.v<b.v;});
dfs1(1,0);
if(m==n-1){
for(int i:ans) cout<<i<<' ';
return 0;
}
reverse(c.begin(),c.end());
int cnt=0,sz=c.size(),tmp=(ans.size()==1?0:ans[ans.size()-2]);
FOR(i,0,c.size()-1){
mp[c[i]]=2; bk[c[i]]=1;
c.psbk(c[i]);
if(c[i]==ans.back()) be=Ei+1+i;
}
for(int i:ans) mp[i]=1;
//outarr(c,0,c.size()-1); outarr(ans,0,ans.size()-1); outval(be,sz);
if(c[be-1]<c[be+1]){
int i,mx=c[be+1];
for(i=be;i>=1;i--){
dfs2(c[i],c[i-1]);
mx=max(mx,calc(c[i]));
if(c[i-1]>=mx) break;
}
//outval(i,c[i]);
dfs2(c[i],N);
FOR(j,i+1,be-1) dfs2(c[j],N);
FOR(j,be,sz+i-2) dfs2(c[j],c[j+1]);
dfs2(c[sz+i-1],N);
REV(j,sz+i-2,be) dfs2(c[j],N);
}else{
int i,mx=c[be-1];
for(i=be;i<=c.size()-2;i++){
dfs2(c[i],c[i+1]);
mx=max(mx,calc(c[i]));
if(c[i+1]>=mx) break;
}
//outval(i,c[i],c[i+1],mx);
dfs2(c[i],N);
REV(j,i-1,be+1) dfs2(c[j],N);
REV(j,be,i-sz+2) dfs2(c[j],c[j-1]);
//outval(i,sz,i-sz,c[i-sz]);
dfs2(c[i-sz+1],N);
FOR(j,i-sz+2,be) dfs2(c[j],N); //outval(j,c[j]);
}
if(tmp) dfs3(tmp,0);
for(int i:ans) cout<<i<<' ';
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...