• 【NOIP2018】旅行


    题面

    https://www.luogu.org/problem/P5022

    题解

    #include<iostream>
    #include<vector>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    struct node{
      int u,v;
    } a[5050];
    
    int n,m,miy[5050],ans[5050],cnt,canu,canv;
    vector <int> to[5050];
    bool vis[5050];
    
    void dfs(int x){
      int i,l=to[x].size();
      miy[++cnt]=x;
      vis[x]=true;
      for (i=0;i<l;i++) if (!vis[to[x][i]]) dfs(to[x][i]);
    }
    
    bool ok(){
      int i;
      if (cnt<n) return false;
      for (i=1;i<=n;i++) if (ans[i]<miy[i]) return true; else if (ans[i]>miy[i]) return false;
      return false;
    }
    
    void dfs2(int x){
      int i,l=to[x].size();
      ans[++cnt]=x;
      vis[x]=true;
      for (i=0;i<l;i++) if (!vis[to[x][i]]) {
        if (canu==x && canv==to[x][i] || canv==x && canu==to[x][i]) ; else dfs2(to[x][i]);
      }
    }
    
    int main(){
      int i,j;
      scanf("%d %d",&n,&m);
      for (i=1;i<=m;i++) {
        scanf("%d %d",&a[i].u,&a[i].v);
        to[a[i].u].push_back(a[i].v);
        to[a[i].v].push_back(a[i].u);
      }
      for (i=1;i<=n;i++) sort(&to[i][0],&to[i][0]+to[i].size());
      if (m==n-1) {
        cnt=0;
        dfs(1);
        for (i=1;i<=n;i++) printf("%d ",miy[i]);
        return 0;
      }
    
      miy[1]=987654321;
      for (i=1;i<=m;i++) {
        memset(vis,0,sizeof(vis));
        canu=a[i].u; canv=a[i].v;
        cnt=0;
        dfs2(1);
        if (ok()) for (j=1;j<=m;j++) miy[j]=ans[j];
      }
      for (i=1;i<=n;i++) printf("%d ",miy[i]);
      return 0;
    }
  • 相关阅读:
    软工人日常
    11.5
    11.4
    11.3
    11.2阅读笔记
    11.1阅读笔记
    10.31 异常
    10.30动手动脑
    10.29
    10.28
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11427437.html
Copyright © 2020-2023  润新知