社区讨论

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 条回复,欢迎继续交流。

正在加载回复...