题面:

传送门

题目描述:

Bob想在公园散步。公园由n个点和m条无向边组成。当Bob到一个未经过的点时,他就会把这个点的编号记录在笔记本上。当且仅当Bob走完所有的点,他才会停下来。这时,Bob的笔记本记录了一个由n个点编号组成的序列,问:Bob能记录的字典序最小的序列。
 

题目分析:

这道题直观想法就是dfs:
里面还有贪心,最短路等等。
但其实呢,这个很容易被误导,我们还是要认真地分析一下题目:
 
先说一下错误的想法:
每一次dfs选字典序最小的点,比如这样:
但是会有这种情况:
用dfs就会一直往下遍历,输出结果就是:1 2 4 3, 但很明显,这个答案是错的,正确的答案应该是:1 2 3 4。路线:1-2-1-3-1-2-4。
有人说,那么bfs就好了啊。对于这个图来说,确实是这样(bfs遍历顺序:1-2-3-4)。但是对于下面这个图:
很明显,用bfs也是错的(用dfs会输出:1 2 4 3),正确答案:1 2 3 4,路径:1-2-3-2-1-4。
虽然我们尝试了两种方法都不行。但是,从上面的分析我们可以看到:之前走过的点是可以走回去的,只不过走过的点不记录而已。
我们可以根据这点对上面的图进行分析:
刚开始Bob从点1出发,根据字典序最小原则,Bob只能走点2才能使字典序最小:
紧接着,Bob可以在1,2间来回走动,而不改变笔记本的记录结果:
这时,我们发现只要先走:和1,2领接编号最小的点(编号为3)就可以使字典序最小:
往点3走后,Bob可以在1,2,3间来回走动,而不改变笔记本的记录结果:
这时和1,2,3这三个点相连的点只有4,那么往点4走就可以了。最后答案是:1 2 3 4,保证字典序最小。
 
实现:用邻接表(存图),标记数组(维护上图红色区域),优先队列(短时间找到和红色区域相连的编号最小的点)
每当从优先队列取出一个点时,肯定是与红色区域相连的编号最小的点,然后把这个点加入红色区域,再把这个点相连的点加入优先队列就可以了。
 
最后:其实我觉得这个有点像最小生成树prim算法的做法 
 
AC代码:
 1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <vector>
6 #include <queue>
7 using namespace std;
8 const int maxn = 1e5+5;
9 int n, m;
10 vector<int> G[maxn]; //vector版邻接表
11 int vis[maxn]; //标记数组
12
13 struct cmp{ //比较函数,优先小的在队列前面
14 bool operator () (int a, int b){
15 return a > b;
16 }
17 };
18
19 void solve(){
20 priority_queue<int, vector<int>, cmp> q;
21 int u;
22 q.push(1);
23
24 while(!q.empty()){
25 u = q.top(); q.pop();
26
27 if(vis[u]) continue; //防止重复访问
28 vis[u] = 1; //标记
29
30 printf("%d ", u); //输出答案
31
32 for(int i = 0; i < G[u].size(); i++){
33 q.push(G[u][i]);
34 //把和u相连的点加入优先队列
35 }
36 }
37 }
38
39 int main(){
40 scanf("%d%d", &n, &m);
41
42 int u, v;
43 for(int i = 1; i <= m; i++){
44 scanf("%d%d", &u, &v);
45 G[u].push_back(v);
46 G[v].push_back(u);
47 }
48
49 solve();
50
51 return 0;
52 }
 
 
 
 

Codeforces Round #538 D. Lunar New Year and a Wander的更多相关文章

  1. Codeforces Round #538 (Div. 2) (A-E题解)

    Codeforces Round #538 (Div. 2) 题目链接:https://codeforces.com/contest/1114 A. Got Any Grapes? 题意: 有三个人, ...

  2. Codeforces Round #538 (Div. 2) (CF1114)

    Codeforces Round #538 (Div. 2) (CF1114)   今天昨天晚上的cf打的非常惨(仅代表淮中最低水平   先是一路缓慢地才A掉B,C,然后就开始杠D.于是写出了一个O( ...

  3. Codeforces Round #538 (Div. 2) C. Trailing Loves (or L'oeufs?) (分解质因数)

    题目:http://codeforces.com/problemset/problem/1114/C 题意:给你n,m,让你求n!换算成m进制的末尾0的个数是多少(1<n<1e18    ...

  4. Codeforces Round #538 (Div. 2)

    目录 Codeforces 1114 A.Got Any Grapes? B.Yet Another Array Partitioning Task C.Trailing Loves (or L'oe ...

  5. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  6. Codeforces Round #538 (Div. 2) E 随机数生成

    https://codeforces.com/contest/1114/problem/E 题意 交互题,需要去猜一个乱序的等差数列的首项和公差,你能问两种问题 1. 数列中有没有数比x大 2. 数列 ...

  7. Codeforces Round #538 (Div. 2) C 数论 + 求b进制后缀零

    https://codeforces.com/contest/1114/problem/C 题意 给你一个数n(<=1e8),要你求出n!在b进制下的后缀零个数(b<=1e12) 题解 a ...

  8. Codeforces Round #538 (Div. 2) D. Flood Fill 【区间dp || LPS (最长回文序列)】

    任意门:http://codeforces.com/contest/1114/problem/D D. Flood Fill time limit per test 2 seconds memory ...

  9. Codeforces Round #538 (Div. 2) CTrailing Loves (or L'oeufs?)

    这题明白的意思就是求n!在b进制下的后缀零的个数. 即最大的n!%(b^k)==0的k的值.我们需要将如果要构成b这个数,肯定是由一个个质因子相乘得到的.我们只需要求出b的质因子,然后分析n!中可以组 ...

随机推荐

  1. windows信息收集

      导语:介绍 特权升级总是被归结为适当的枚举.但要完成适当的枚举,你需要知道要检查和查找的内容.这通常需要伴随着经验的丰富而对系统非常熟悉.起初特权升级看起来像是一项艰巨的任务,但过了一段时间,你就 ...

  2. USB2.0协议学习笔记---USB数据包结构

    USB包类型和传输过程  USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同 ...

  3. 翻译:《实用的Python编程》01_05_Lists

    目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件) 1.5 列表 本节介绍 Python 原始数据类型列表(list). 列表是一种有序的集合. 创建列表 使用方括号 [] 来定义列表 ...

  4. shit vuepress docs

    shit vuepress docs https://deploy-preview-2764--vuepress.netlify.app/guide/directory-structure.html ...

  5. How to enable HTTPS for local development in macOS using Chrome

    How to enable HTTPS for local development in macOS using Chrome HTTPS, macOS, Chrome local HTTPS htt ...

  6. node os env reader

    node os env reader node-os-env-reader.js #!/usr/bin/env node "use strict"; /** * * @author ...

  7. Microsoft Solitaire Collection

    Microsoft Solitaire Collection game https://zone.msn.com/gameplayer/gameplayerHTML.aspx?game=mssolit ...

  8. project generators & project scaffold

    project generators & project scaffold how to write a node cli & Project Scaffold https://www ...

  9. taro css 转换 bug

    taro css 转换 bug https://nervjs.github.io/taro/docs/size.html https://nervjs.github.io/taro/docs/comp ...

  10. svg & regex

    svg & regex https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reg ...