96分求救 wa#23
查看原帖
96分求救 wa#23
230738
SZbr楼主2023/10/2 16:07
#include<bits/stdc++.h>
using namespace std;
#define Pair pair<int,int>
#define mk make_pair
const int N=5e3+7;
int n,m;
vector<int> nxt[N];
bool vis[N],flt[N];
bool flag=false;
queue<int> ans;
void cir(int it,int fa,int be){
    vis[it]=true;
    for(int v:nxt[it]){
        if(v==fa) continue;
        if(v==be) flag=true;
        if(vis[v]) continue;
        cir(v,it,be);
    }
}
void find_circle(){
    for(int i=1;i<=n;++i){
        flag=false;
        memset(vis,0,sizeof(vis));
        cir(i,0,i);
        if(flag){
            flt[i]=true;
            // cout<<i<<endl;
        }
    }
}

bool ret=false;//记录是否回退
void dfs(int it,int fa,int minn){
    cout<<it<<" ";
    priority_queue<int,vector<int>,greater<int> > qu;
    vis[it]=true;
    ans.push(it);
    //init
    int maxt=0,mint=0x3f3f3f3f;
    for(int v:nxt[it]){
        if(vis[v]) continue;
        // cout<<it<<"->"<<v<<endl;
        qu.push(v);
        if(flt[v]){
            mint=min(mint,v);
            maxt=max(maxt,v);
        }
    }
    //非环
    if(!flt[it]){
        while(!qu.empty()){
            dfs(qu.top(),it,minn);
            qu.pop();
        }
    }
    else{//环
        int xtt=minn;
        if(!xtt) xtt=maxt;//记录环的另一端
        while(!qu.empty()){
            int nxt=qu.top();
            qu.pop();
            if(vis[nxt]) continue;//防止再次走环的另一端
            if(flt[nxt]){//绕着环走
                if(flt[fa]&&minn<nxt&&!ret){//若可回溯支链(或环的另一端)最小小于下一个环的点且曾经没回退过,则可以退回
                    ret=true;
                    continue;//跳过并走完支链后方可回溯
                }
                // cout<<it<<"->"<<nxt<<endl;
                dfs(nxt,it,(!qu.empty() ? qu.top():xtt));//选择绕环并去传递可回溯支链的最小
            }
            else{//走支链
                // cout<<it<<"->"<<nxt<<endl;
                dfs(nxt,it,minn);
            }
        }
    }
}
void solve(){
    memset(vis,0,sizeof(vis));
    dfs(1,0,0);
}
void print(){
    puts("");
    while(!ans.empty()){
        cout<<ans.front()<<" ";
        ans.pop();
    }
    puts("");
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=m;++i){
        int u,v;
        cin>>u>>v;
        nxt[u].push_back(v);
        nxt[v].push_back(u);
    }
    find_circle();
    // puts(";;;");
    solve();
    // print();
    return 0;
}
2023/10/2 16:07
加载中...