【题解】NOIP2018 旅行
\(\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 旅行的更多相关文章
- 竞赛题解 - NOIP2018 旅行
\(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 ...
- 【LG5022】[NOIP2018]旅行
[LG5022][NOIP2018]旅行 题面 洛谷 题解 首先考虑一棵树的部分分怎么打 直接从根节点开始\(dfs\),依次选择编号最小的儿子即可 而此题是一个基环树 怎么办呢? 可以断掉环上的一条 ...
- [题解]NOIP2018(普及组)T1标题统计(title)
NOIP2018(普及组)T1标题统计(title) 题解 [代码(AC)] #include <iostream> #include <cstdio> #include &l ...
- 竞赛题解 - NOIP2018 保卫王国
\(\mathcal{NOIP2018}\) 保卫王国 - 竞赛题解 按某一个炒鸡dalao名曰 taotao 的话说: \(\ \ \ \ \ \ \ \ \ "一道sb倍增题" ...
- 竞赛题解 - NOIP2018 赛道修建
\(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...
- NOIP2018 旅行 和 赛道修建
填很久以前的坑. 旅行 给一棵 n 个点的基环树,求字典序最小的DFS序. n ≤ 5000 题解 O(n2) 做法非常显然,枚举断掉环上哪条边然后贪心即可.当然我去年的骚操作只能得88分. O(n ...
- [NOIP2018]:旅行(数据加强版)(基环树+搜索+乱搞)
题目描述 小$Y$是一个爱好旅行的$OIer$.她来到$X$国,打算将各个城市都玩一遍.小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路.每条双向道路连接两个城市.不存在两条连接同一对城市 ...
- NOIP2018旅行
这道题考场上的时候暴力写RE了,我果然很菜. 看了一篇大佬的的题解才明白 dalao的题解 但是解释很少哇,为了造福人类,在下发一篇详细一点的题解. 预处理:用vector把与每个点相连的点存起来,排 ...
- [NOIP2018]旅行(数据加强版)(图论+基环树)
数据范围多了2个0就是不一样,O(n^2)只能68分了.(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了不说废话直接写题解:首先dfs一遍找到环,然后和 ...
随机推荐
- POJ-1273Drainage Ditches(网络流入门题,最大流)
Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This ...
- A Walk Through the Forest (最短路+记忆化搜索)
Jimmy experiences a lot of stress at work these days, especially since his accident made working dif ...
- SpringBoot整合Quartz及log4j实例
SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...
- css实例——“旋转”太极八卦图
话不多说,直接上代码: HTML代码部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- 《闲扯Redis十一》Redis 有序集合对象底层实现
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- 跟着尚硅谷系统学习Docker-【day07】
day07-20200722 p27.dockerfile案例编写-3 第一步:编写父dockerfile DockerFile_20200722_2 FROM centos RUN yum ...
- Agumater 增加基本数据上传下载能力
- 取得min和max之间包括端点的随机整数
产生随机数的函数用处不少,写一个放博客里备用,函数如下: /** * get a random integer between min and max * @param min * @param ma ...
- HTML绘制表格
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Nice to meet you
Who am i 详情可以参见我的这一篇博文 Why and how 其实之前就想在博客园开创自己的博客了,但是自己之前已经利用自己的GitHub搭建了一个 博客,然后的话自己写的文章即水又不多,说到 ...