首页 > 其他分享 >【题解】Luogu[P5022] [NOIP2018 提高组] 旅行

【题解】Luogu[P5022] [NOIP2018 提高组] 旅行

时间:2023-08-03 12:56:32浏览次数:37  
标签:遍历 return int 题解 NOIP2018 vis Luogu NR 我们

Link

因为是道NOIP,那么我们不妨按照考场上的策略一点一点想。

先看部分分,有一档有很明显的特征 \(n=m-1\) 这显然构成一棵树,对于一棵树,我们想把他按照题目的要求遍历完,一定是像dfs的遍历顺序一样,对于一个点,必然遍历完以它为根的子树,才能回到它的父亲节点,于是就有了一个很明显的贪心策略,我们从节点 \(1\) 开始遍历,对于一个点 \(x\),我们按照从小到大的顺序去遍历它的儿子,因为是字典序最小,于是我们很容易证明这种“步步为赢”的策略是对的。

于是 \(60pts\) 我们就到手了,在考场上我们就需要考试是否还需要去想剩下的 \(40pts\),正确选择去写正解还是部分分,体现的就是智慧了。

剩下 \(40pts\) 同样有很明显的特征 \(n=m\) 这显然就是一个基环树,树的情形我们已经会做,那么此时我首先就会思考是否能把基环树的情形转化成我们已经会了的树。

一开始我想的是先找环,对于一个节点 \(x\),若其儿子在环上,用贪心策略通过断环为链的方式转化成树,但是仔细思考发现有些难以实现。

我们知道基环树删掉环上一边,其必然成一棵树,再一看数据范围发现 \(n,m\) 都比较小,很明显是个 \(O(n^2)\) 的算法,于是我们就可以暴力枚举每一条边,删掉这条边,于是转化为了树,然后按照之前 \(60pts\) 同样的方法求得答案,再在众多答案中取最小值,于是完美的通过了这道题,时间复杂度 \(O(n^2)\)

整体来说比较简单,考场上属于送分题。

#include<bits/stdc++.h>
using namespace std;
const int NR=5005;
int n,m;
vector<int>e[NR],ans;
int U[NR],V[NR];
namespace s1{//60pts
    bool vis[NR];int res[NR],cnt;
    void dfs(int u){
        ans.push_back(u),vis[u]=true;
        for(int i=0;i<e[u].size();++i){
            int v=e[u][i];
            if(!vis[v])dfs(v);
        }
    }
    void solve(){
        dfs(1);
        for(int i=0;i<ans.size();++i)
            cout<<ans[i]<<" ";
    }
}
namespace s2{//100pts
    bool vis[NR];int nu,nv,step;
    int res[NR],ans[NR];
    bool cmp(){
        for(int i=1;i<=n;++i)
            if(res[i]<ans[i])return true;
            else if(res[i]>ans[i])return false;
        return false;
    }
    bool chk(int u,int v){
        if(u==nu&&v==nv||u==nv&&v==nu)return false;
        return true;
    }
    void dfs(int u){
        vis[u]=true,res[++step]=u;
        for(int i=0;i<e[u].size();++i){
            int v=e[u][i];
            if(!vis[v]&&chk(u,v))dfs(v);
        }
    }
    void solve(){
        for(int i=1;i<=m;++i){
            int u=U[i],v=V[i];
            memset(res,0,sizeof(res)),memset(vis,false,sizeof(vis)),step=0;
            nu=u,nv=v,dfs(1);
            if(step<n)continue;//若删掉的这条边不在环上,无法成为连通图,就跳过。
            if(ans[1]==0||cmp())memcpy(ans,res,sizeof(res));
        }
        for(int i=1;i<=n;++i)
            cout<<ans[i]<<" ";
    }
}
int main(){
    cin>>n>>m;
    for(int i=1,u,v;i<=m;++i)
        cin>>u>>v,e[u].push_back(v),e[v].push_back(u),U[i]=u,V[i]=v;
    for(int i=1;i<=n;++i)
        sort(e[i].begin(),e[i].end());
    if(m==n-1)s1::solve();
    else if(m==n)s2::solve();
    return 0;
}

标签:遍历,return,int,题解,NOIP2018,vis,Luogu,NR,我们
From: https://www.cnblogs.com/agrumestly/p/17603024.html

相关文章

  • RTMP流媒体服务器LntonMedia(免费版)视频平台在配置域名/公网的IP之后登陆一直显示服务
    LntonMedia是一款功能强大的视频平台,除了支持视频直播功能,还支持视频点播。它可以处理各种音视频文件,包括手机推流、演示视频、短频、音乐等。您可以通过多种上传方式将这些文件上传到平台上,支持批量上传和大文件上传。我们发现在LntonMedia配置了域名/公网ip后,在登录的时候发生了......
  • 关闭防火墙,主机与虚拟机VMnet8在同一网段,主机无法ping通虚拟机问题解决
    因需要进行oss数据迁移至eos,需要liunx环境,于是在本机上使用虚拟机安装了centos7,安装后ifconfig查看虚拟机ip,网络模式是NAT然后ping主机以及百度网,均可ping通,说明虚拟机网络正常  但是使用xshell后,一直无法连接,主机ping虚拟机,请求超时,以为是虚拟机防火墙问题,关闭虚拟机防火......
  • RTMP流媒体服务器LntonMedia(免费版)平台服务器性能扩张后重启但无法运行的问题解决方案
    LntonMedia支持一站式的上传、转码、直播、回放、嵌入、分享功能,具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务,全面满足超低延迟、超高画质、超大并发访问量的要求。在推流方面,LntonMedia支持手机推流,支持短视频、音乐等......
  • 记录使用uview的tabs组件初始化渲染下划线移位问题解决
    问题描述:初始化渲染后tabs的下划线没有居中对其,出现异位。问题分析: 网上很多大佬分析过出现原因了记录下解决的过程: 在各个论坛搜集到解决方案都暂时无效 有使用v-if重新渲染的  有给类赋值偏移值的 有强行转换px的因为各种原因这些方法在自己身上没有奏效所以记......
  • CCPC Changchun 2020 D, Meaningless Sequence题解
    听说是签到题。不难看出设x为i二进制个数下1的个数(还是难的),则a_i=c^x。那么我们只需要考虑所有0到n的个数。当n为1111时,可以得到为(1+c)^n次方,那么我们把答案看成两部分一部分是1到111...和1000到n,那么当si位为1时,可以看成是n去掉前一位后再乘以c,递推得到每一个位置的答案,就是......
  • 题解 SP15454
    前言数学符号约定\(\operatorname{lowbit}(x)\):表示\(x\)的二进制最低位。\([a,b]\):表示区间\(a\simb\),其中包含\(a,\,b\)端点,其区间长度为\(b-a+1\)。如非特殊说明,将会按照上述约定书写符号。题目大意有一个初始全为\(0\)的序列\(A\),你需要支持一下操作:add......
  • 题解 ARC104F
    前言在这里首先感谢一下题解区的FZzzz,本人的题解思路主要是基于他并给出了自己的理解。如非特殊说明,本题解中的数学符号原则上与题目中一致。题目分析需要转化的喵喵题。我们需要把原问题转化成一个图论计数问题,然后剩下的就很好办了。好,首先让我们修改一下题目的要求,将不......
  • 题解 AGC054D
    前言因为本人尚菜,所以本篇文章没有什么数学符号,请大家放心食用。题目分析先吐槽一嘴,这个o表示(),这个x表示)(,十分形象。好,我们先观察原序列,容易得出第一条性质:ox的加入不会让我们不合法的序列变合法,相反,它会让我们合法的序列变不合法。于是可以得出,无论如何,只要我们......
  • [刷题笔记] Luogu P1853 投资的最大效益
    ProblemSolution刚开始看这道题的时候不自主的想到了纪念品,但其实本题和纪念品还是有区别的。纪念品规定了每次只能买一个纪念品,而本题可以买无限个纪念品需要在原本的基础上买进卖出,钱有进有出,而本题时只有进,稳赚不赔。本题和纪念品不同的第一点决定了它时完全背包,纪念品......
  • [刷题笔记] Luogu P5662 [CSP-J2019] 纪念品
    ProblemDescription类似于炒股票,有买进有卖出,当天可以既买进又卖出无限次,现在有若干件物品,每件物品都有一个价格,每天每件物品的价格不一致,你初始有\(m\)元钱,想要通过若干次购进卖出的操作,使得\(T\)天后你手里的钱最多。要求:\(T\)天结束你手中的股票必须全部售出。Solution乍看......