D30 基环树 P5022 [NOIP2018 提高组] 旅行

视频链接:393 基环树 [NOIP2018 提高组] 旅行_哔哩哔哩_bilibili

 

 

Luogu P5022 [NOIP2018 提高组] 旅行

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N=5010;
int n,m,a,b;
vector<int> e[N];
pair<int,int> edge[N];
int du,dv,vis[N];
vector<int> path(N,N);
int cnt,better;

bool dfs(int u){
  if(!better){
    //若序号变大则回退,变小则走完
    if(u>path[cnt])return true;
    if(u<path[cnt])better=-1;
  }
  vis[u]=true;
  path[cnt++]=u;
  for(int i=0;i<e[u].size();i++){
    int v=e[u][i];
    if(vis[v])continue;
    if(v==du&&u==dv)continue;
    if(v==dv&&u==du)continue;
    if(dfs(v))return true;
  }
  return false;
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=m;i++){
    scanf("%d%d",&a,&b);
    e[a].push_back(b);
    e[b].push_back(a);
    edge[i]={a,b};
  }
  for(int i=1;i<=n;i++)
    sort(e[i].begin(),e[i].end());
    
  if(n==m+1) dfs(1);
  else{
    for(int i=1;i<=m;i++){//枚举断边
      du=edge[i].first;
      dv=edge[i].second;
      memset(vis,0,sizeof vis);
      cnt=better=0;
      dfs(1);
    }
  }
  for(int i=0;i<n;i++)
    printf("%d ",path[i]);
  return 0;
}

 

posted @ 2022-07-11 21:55  董晓  阅读(286)  评论(0编辑  收藏  举报