luogu5022 [NOIp2018]旅行 (dfs)】的更多相关文章

m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #include<set> using namespace std; typedef long lo…
[LG5022][NOIP2018]旅行 题面 洛谷 题解 首先考虑一棵树的部分分怎么打 直接从根节点开始\(dfs\),依次选择编号最小的儿子即可 而此题是一个基环树 怎么办呢? 可以断掉环上的一条边,这样就变为一棵树了 再用上面的方法做即可 \(tips\) \(:\) 断环上的边,其实可以直接用\(tarjan\)把桥求出来 不是桥的就是环上的边 考场上的代码有点乱 #include <iostream> #include <cstdio> #include <cstd…
\(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 Y 是一个爱好旅行的 OIer.她来到 X 国,打算将各个城市都玩一遍. 小Y了解到, X国的 \(n\) 个城市之间有 \(m\) 条双向道路.每条双向道路连接两个城市. 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且, 从任意一个城市出发,通过这些道路都可以到达任意…
填很久以前的坑. 旅行 给一棵 n 个点的基环树,求字典序最小的DFS序. n ≤ 5000 题解 O(n2) 做法非常显然,枚举断掉环上哪条边然后贪心即可.当然我去年的骚操作只能得88分. O(n log n) 做法,推荐duoluoluo的博客. 环上要删的边是固定的,我们在环上走的时候,只有当其出边连向的点中,环上点编号最大,且比回溯到父亲后第一个走的点还大,这时候才回溯,其他时候就正常跑DFS. #include<bits/stdc++.h> using namespace std;…
题目描述 小$Y$是一个爱好旅行的$OIer$.她来到$X$国,打算将各个城市都玩一遍.小$Y$了解到,$X$国的$n$个城市之间有$m$条双向道路.每条双向道路连接两个城市.不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路.并且,从任意一个城市出发,通过这些道路都可以到达任意一个其他城市.小$Y$只能通过这些道路从一个城市前往另一个城市.小$Y$的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者…
这道题考场上的时候暴力写RE了,我果然很菜. 看了一篇大佬的的题解才明白 dalao的题解 但是解释很少哇,为了造福人类,在下发一篇详细一点的题解. 预处理:用vector把与每个点相连的点存起来,排一遍序. m=n-1的情况 这种比较好处理,搜到一个节点后找一个与该节点相连的最小的编号的儿子继续往下搜,显然这样答案更优.不过要小心RE. 具体代码就是: void work(int u,int fa) { if(vis[u]) return ; vis[u]=1; ans[++dep]=u; f…
发现 \(m\) 只有两种取值,于是可做了 树的直接贪心 图的枚举环上的边去掉,然后做树的贪心,搜的时候剪一下枝吧 写得有点乱 #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db double #define ld long double #define ull unsigned long long #define ft first #define sd second #define p…
数据范围多了2个0就是不一样,O(n^2)只能68分了.(其中60分是n=m+1和原题一样的做法送的),这题直接从NOIP难度变为NOI Plus难度了不说废话直接写题解:首先dfs一遍找到环,然后和n=m+1一样从1号点访问,然后跑到环以后,对于环上的点,可以执行仅一次返回到第一次到达环上的点的操作.所以dfs记录的时候记录下次访问的点就可以,因为退回操作后只要退回途中下面有点,那么就必须访问,讨论一下退回途中访问的第1个点,比较其余环上下一个点的大小就行了.注意dfs时要打标记(否则可能会有…
嘟嘟嘟 鉴于一些知道的人所知道的,不知道的人所不知道的原因,我来发NOIPday2T1的题解了. \(O(n ^ 2)\)的做法自然很暴力,枚举断边断环为链就行了. 所以我是来讲\(O(nlogn)\)的做法的. 准确说是排序复杂度,剩下的都是\(O(n)\)的. 大体思想就是通过一遍dfs\(O(n)\)找到该断的边,然后跑一遍树输出答案就行了. 为了方便,我们把在环外并和环上节点直接相连的点称作某个点的子结点. 那么对于环上的结点\(i\)和下一个结点\(nxt[i]\),肯定是先把小于\(…
题目戳我 \(\text{Solution:}\) 首先题目描述有一点不准确:回头是必须要走完一条路无路可走的时候才能返回. 对于树的情况:显然贪心做就完事了. 对于基环树的情况:对于一个\(n\)条边的环,如果我们已经走了\(n-1\)条边,那么此时我们已经可以到达环上任意一点了.所以我们可以枚举并删边. 题目中要求一个点除非回溯否则不能再次访问,这意味着一定有一条边无法访问,枚举那一条边即可. 时间复杂度\(O(n^2).\) #include<bits/stdc++.h> using n…