求助23,24,25
查看原帖
求助23,24,25
428358
Grisses楼主2022/7/20 10:12

rt

  #include<bits/stdc++.h>
  using namespace std;
  int read(){
      int x=0;
      char c=getchar();
      while(c>'9'||c<'0')c=getchar();
      while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^'0'),c=getchar();
      return x;
  }
  int n,m,tmp,tot,f[500005],last[500005];
  bool F,flag,vis[500005],dis[500005];
  stack<int>S;
  vector<int>G[500005];
  void dfs(int x){
      if(vis[x]){
          for(int i=1;i<=n;i++)vis[i]=0;
          int k;
          for(k=1;last[k]!=x;k++);
          for(k;k<=tot;k++)vis[last[k]]=1;
          flag=1;
          return;
      }
      vis[x]=1;
      last[++tot]=x; 
      for(auto v:G[x]){
          if(v==f[x])continue;
          f[v]=x;
          dfs(v);
          if(flag)return;
      }
      last[tot--]=0;
  }
  void dfs1(int x,int last);
  void dfs2(int x,int last,int cnt){
      if(dis[x])return;
      dis[x]=1;
      printf("%d ",x);
  //	cerr<<endl<<"---"<<x<<' '<<last<<' '<<cnt<<endl;
      priority_queue<int,vector<int>,greater<int> >q;
      for(auto v:G[x])if(v!=last)q.push(v);
      bool f=1;
      while(!q.empty()){
          tmp=q.top();
          q.pop();
          if(vis[tmp]&&f){
              f=0;
              cnt=(q.empty()?cnt:q.top());
              if(tmp<=cnt)dfs2(tmp,x,cnt);
          }
          else dfs1(tmp,x);
      }
  }
  void dfs1(int x,int last){
      if(dis[x])return;
      dis[x]=1;
      printf("%d ",x);
      priority_queue<int,vector<int>,greater<int> >q;
      for(auto v:G[x])if(v!=last)q.push(v);
      while(!q.empty()){
          tmp=q.top();
          q.pop();
          if(vis[tmp]&&!F){
              F=1;
              dfs2(tmp,x,INT_MAX);
          }
          else dfs1(tmp,x);
      }
  }
  void Dfs(int x){
      printf("%d ",x);
      priority_queue<int,vector<int>,greater<int> >q;
      for(auto v:G[x])if(v!=f[x])q.push(v),f[v]=x;
      while(!q.empty()){
          Dfs(q.top());
          q.pop();
      }
  }
  signed main()
  {
  //	freopen("travel4.in","r",stdin);
  //	freopen("travel.out","w",stdout);
      n=read();m=read();
      for(int i=1,u,v;i<=m;i++)u=read(),v=read(),G[u].push_back(v),G[v].push_back(u);
      if(n==m+1){
          Dfs(1);
          return 0;
      }
      dfs(1);
  //	for(int i=1;i<=n;i++)if(vis[i])cerr<<i<<' ';
  //	cerr<<endl;
      if(vis[1])dfs2(1,0,INT_MAX);
      else dfs1(1,0);
      return 0;
  }
  /*
  7 7
  1 2
  2 3
  3 4
  3 6
  3 7
  6 5
  5 2


  1 2 3 4 6 5 7
  */
2022/7/20 10:12
加载中...