题目戳我

\(\text{Solution:}\)

首先题目描述有一点不准确:回头是必须要走完一条路无路可走的时候才能返回。

对于树的情况:显然贪心做就完事了。

对于基环树的情况:对于一个\(n\)条边的环,如果我们已经走了\(n-1\)条边,那么此时我们已经可以到达环上任意一点了。所以我们可以枚举并删边。

题目中要求一个点除非回溯否则不能再次访问,这意味着一定有一条边无法访问,枚举那一条边即可。

时间复杂度\(O(n^2).\)

#include<bits/stdc++.h>
using namespace std;
const int inf=(1<<30);
int n,m,E[5001][2];
vector<int>G[5001];
namespace P1{
vector<int>ans;
void dfs(int x,int y){
ans.push_back(x);
for(int i=0;i<G[x].size();++i){
int j=G[x][i];
if(j==y)continue;
dfs(j,x);
}
}
void solve(){
dfs(1,0);
for(int i=0;i<ans.size();++i)printf("%d ",ans[i]);
puts("");
}
}
namespace P2{
vector<int>ans,res;
bitset<5001>vis;
int Dv,Du;
void dfs(int x,int fa){
res.push_back(x);vis[x]=1;
for(int i=0;i<G[x].size();++i){
int j=G[x][i];
if((x==Du&&j==Dv)||(x==Dv&&j==Du)||vis[j]||j==fa)continue;
dfs(j,x);
}
}
inline bool check(){
for(int i=0;i<n;++i){
if(ans[i]!=res[i]){
if(ans[i]>res[i])return false;
return true;
}
}
return true;
}
void solve(){
for(int i=0;i<n;++i)ans.push_back(inf),res.push_back(0);
for(int i=1;i<=m;++i){
res.clear();vis.reset();
Du=E[i][0],Dv=E[i][1];
dfs(1,0);
for(;(int)res.size()<n;)res.push_back(inf);
if(!check())swap(res,ans);
}
for(int i=0;i<n;++i)printf("%d ",ans[i]);
puts("");
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
E[i][0]=x,E[i][1]=y;
}
for(int i=1;i<=n;++i)sort(G[i].begin(),G[i].end());
if(m==n-1){P1::solve();return 0;}
P2::solve();
return 0;
}

【题解】NOIP2018 旅行的更多相关文章

  1. 竞赛题解 - NOIP2018 旅行

    \(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 ...

  2. 【LG5022】[NOIP2018]旅行

    [LG5022][NOIP2018]旅行 题面 洛谷 题解 首先考虑一棵树的部分分怎么打 直接从根节点开始\(dfs\),依次选择编号最小的儿子即可 而此题是一个基环树 怎么办呢? 可以断掉环上的一条 ...

  3. [题解]NOIP2018(普及组)T1标题统计(title)

    NOIP2018(普及组)T1标题统计(title) 题解 [代码(AC)] #include <iostream> #include <cstdio> #include &l ...

  4. 竞赛题解 - NOIP2018 保卫王国

    \(\mathcal{NOIP2018}\) 保卫王国 - 竞赛题解 按某一个炒鸡dalao名曰 taotao 的话说: \(\ \ \ \ \ \ \ \ \ "一道sb倍增题" ...

  5. 竞赛题解 - NOIP2018 赛道修建

    \(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...

  6. NOIP2018 旅行 和 赛道修建

    填很久以前的坑. 旅行 给一棵 n 个点的基环树,求字典序最小的DFS序. n ≤ 5000 题解 O(n2) 做法非常显然,枚举断掉环上哪条边然后贪心即可.当然我去年的骚操作只能得88分. O(n ...

  7. [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞)

    题目描述 小$Y$是一个爱好旅行的$OIer$.她来到$X$国,打算将各个城市都玩一遍.小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路.每条双向道路连接两个城市.不存在两条连接同一对城市 ...

  8. NOIP2018旅行

    这道题考场上的时候暴力写RE了,我果然很菜. 看了一篇大佬的的题解才明白 dalao的题解 但是解释很少哇,为了造福人类,在下发一篇详细一点的题解. 预处理:用vector把与每个点相连的点存起来,排 ...

  9. [NOIP2018]旅行(数据加强版)(图论+基环树)

    数据范围多了2个0就是不一样,O(n^2)只能68分了.(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了不说废话直接写题解:首先dfs一遍找到环,然后和 ...

随机推荐

  1. POJ-1273Drainage Ditches(网络流入门题,最大流)

    Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This ...

  2. A Walk Through the Forest (最短路+记忆化搜索)

    Jimmy experiences a lot of stress at work these days, especially since his accident made working dif ...

  3. SpringBoot整合Quartz及log4j实例

    SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...

  4. css实例——“旋转”太极八卦图

    话不多说,直接上代码: HTML代码部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...

  5. 《闲扯Redis十一》Redis 有序集合对象底层实现

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

  6. 跟着尚硅谷系统学习Docker-【day07】

    day07-20200722   p27.dockerfile案例编写-3   第一步:编写父dockerfile DockerFile_20200722_2 FROM centos RUN yum ...

  7. Agumater 增加基本数据上传下载能力

  8. 取得min和max之间包括端点的随机整数

    产生随机数的函数用处不少,写一个放博客里备用,函数如下: /** * get a random integer between min and max * @param min * @param ma ...

  9. HTML绘制表格

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Nice to meet you

    Who am i 详情可以参见我的这一篇博文 Why and how 其实之前就想在博客园开创自己的博客了,但是自己之前已经利用自己的GitHub搭建了一个 博客,然后的话自己写的文章即水又不多,说到 ...