【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;
}
原文地址:https://www.cnblogs.com/shxnb666/p/11427437.html