NOIP2018 DAY2 T1

NOIP DAY2 TI 旅行

题目描述

小 Y 是一个爱好旅行的 OIer。她来到 X 国,打算将各个城市都玩一遍。

小Y了解到, X国的 nn 个城市之间有 mm 条双向道路。每条双向道路连接两个城市。
不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路。并且,
从任意一个城市出发,通过这些道路都可以到达任意一个其他城市。小 Y 只能通过这些 道路从一个城市前往另一个城市。

小 Y 的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可
以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者沿着第一次访问该 城市时经过的道路后退到上一个城市。当小 Y
回到起点时,她可以选择结束这次旅行或 继续旅行。需要注意的是,小 Y 要求在旅行方案中,每个城市都被访问到。

为了让自己的旅行更有意义,小 Y 决定在每到达一个新的城市(包括起点)时,将 它的编号记录下来。她知道这样会形成一个长度为 nn
的序列。她希望这个序列的字典序 最小,你能帮帮她吗? 对于两个长度均为 nn 的序列 AA 和 BB,当且仅当存在一个正整数
xx,满足以下条件时, 我们说序列 AA 的字典序小于 BB。
对于任意正整数 1 ≤ i < x1≤i<x,序列 AA 的第 ii 个元素 A_iA i ​ 和序列 BB 的第 ii 个元素
B_iB i ​ 相同。
序列 AA 的第 xx 个元素的值小于序列 BB 的第 xx 个元素的值。

一开始就觉得是一颗树,把子节点大小排个序,直接贪心搜就好了

后来发现是张图,还是太菜了

  • 那么作为图,照样可以做,只不过需要删边,看了别人的博客,知道了基环树
  • 才知道。我还是tcl
  • 偷张图来
  • 偷来的图

考虑

我们可以考虑删边进行这个操作。基环树有一个很好的性质,删了一条边就变成一棵树。如果我们手玩一下基环树的样例可以发现:必定有一条边是不会经过的,因此就可以想到删边,然后类似于在树上进行贪心的思路即可。

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,del;
int start[5005],to[5005],cur[5005],ans[5005];
vector <int> v[5005];
bool check()
{
    if(cnt!=n) return false;
    for(int i=1;i<=n;i++) if(cur[i]!=ans[i]) return ans[i]>cur[i];
}
void dfs(int u,int f)
{
    if(cnt>n) return ;
    cur[++cnt]=u;
    for(int i=0;i<v[u].size();i++)
    {
        if(v[u][i]==f||(u==start[del]&&v[u][i]==to[del])||(v[u][i]==start[del]&&u==to[del])) 
            continue;
        dfs(v[u][i],u);
    }
}
int main()
{
    memset(ans,64,sizeof(ans));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
        start[i]=x;
        to[i]=y;
    }
    for(int i=1;i<=n;i++) sort(v[i].begin(),v[i].end());
    if(m==n-1)
    {
        del=0; cnt=0;
        dfs(1,0);
        memcpy(ans,cur,sizeof(cur));
    }
    else
    {
        for(int i=1;i<=m;i++)
        {
            memset(cur,0,sizeof(cur));
            del=i; cnt=0;
            dfs(1,0);
            if(check()) memcpy(ans,cur,sizeof(cur));
        }
    }
    for(int i=1;i<=n;i++) printf("%d ",ans[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40926479/article/details/84918607