题目连接:https://www.luogu.org/problemnew/show/P5022

\(NOIP2018 DAY2T1\)

考场上只写了60分,很容易想到当 m = n - 1 时的树的做法。

读题推一下样例不难发现,如果选择一个分支节点就必须走到头——直到一个节点没有子树。

那么我们就可以贪心的求得最小字典序序列,每次选择节点编号最小的走。

即对当前节点的所有子节点排序选择最小编号的往下进行即可。

60分code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn = 5010;
  7. struct edge{
  8. int to, next;
  9. }e[maxn<<2];
  10. int head[maxn], cnt, n, m;
  11. bool vis[maxn];
  12. void add(int u, int v)
  13. {
  14. e[++cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;
  15. }
  16. void dfs(int x)
  17. {
  18. if(vis[x]) return;
  19. vis[x] = 1;
  20. printf("%d ",x);
  21. int a[maxn], num = 0;
  22. for(int i = 1; i <= n; i++) a[i] = 0;
  23. for(int i = head[x]; i != -1; i = e[i].next)
  24. a[++num] = e[i].to;
  25. sort(a+1, a+1+num);
  26. for(int i = 1; i <= num; i++)
  27. dfs(a[i]);
  28. }
  29. int main()
  30. {
  31. memset(head, -1, sizeof(head));
  32. scanf("%d%d",&n,&m);
  33. for(int i = 1; i <= m; i++)
  34. {
  35. int u, v;
  36. scanf("%d%d",&u,&v);
  37. add(u, v);
  38. add(v, u);
  39. }
  40. dfs(1);
  41. return 0;
  42. }

100分做法:

考虑 m = n 这个情况,树多加一条边(无自环重边情况下)会变成一个环套树。

环套树有一个性质是删去环上的一边就会成为一棵树。

那么当是一棵树的时候,我们能找到一个最优解,当 m = n 时,我们就可以找出多棵树的最优解,在这些最优解中选取一个最优的最优解,就是 m = n 时的最优解。

所以我们只需要把这多棵树的最优解找出来就行了。

所以我们需要把环上的边枚举断掉使原图成为一棵树再进行60分的做法。

考虑数据范围<=5000,N^2暴力断边即可。

code:

  1. #include <vector>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. const int maxn = 5010;
  8. struct edge{
  9. int to, next;
  10. }e[maxn<<2];
  11. int head[maxn], cnt, n, m, u[maxn], v[maxn];
  12. bool vis[maxn];
  13. void add(int u, int v)
  14. {
  15. e[++cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;
  16. }
  17. void dfs(int x)
  18. {
  19. if(vis[x]) return;
  20. vis[x] = 1;
  21. printf("%d ",x);
  22. int a[maxn], num = 0;
  23. for(int i = 1; i <= n; i++) a[i] = 0;
  24. for(int i = head[x]; i != -1; i = e[i].next)
  25. a[++num] = e[i].to;
  26. sort(a+1, a+1+num);
  27. for(int i = 1; i <= num; i++)
  28. dfs(a[i]);
  29. }
  30. //=======================
  31. vector<int> E[maxn];
  32. int ANS[maxn], NOW[maxn], TOT, CUTu, CUTv;
  33. bool VIS[maxn];
  34. void DFS(int x)
  35. {
  36. if(VIS[x]) return;
  37. VIS[x] = 1;
  38. NOW[++TOT] = x;
  39. for(int i = 0; i < E[x].size(); i++)
  40. {
  41. int y = E[x][i];
  42. if((y == CUTv && x == CUTu) || (x == CUTv && y == CUTu)) continue;
  43. DFS(y);
  44. }
  45. }
  46. bool check()
  47. {
  48. for(int i = 1; i <= n; i++)
  49. {
  50. if(ANS[i] == NOW[i]) continue;
  51. if(ANS[i] > NOW[i]) return 1;
  52. if(ANS[i] < NOW[i]) return 0;
  53. }
  54. }
  55. int main()
  56. {
  57. memset(head, -1, sizeof(head));
  58. scanf("%d%d",&n,&m);
  59. for(int i = 1; i <= m; i++)
  60. {
  61. scanf("%d%d",&u[i],&v[i]);
  62. add(u[i], v[i]);
  63. add(v[i], u[i]);
  64. E[u[i]].push_back(v[i]);
  65. E[v[i]].push_back(u[i]);
  66. }
  67. for(int i = 1; i <= n; i++) sort(E[i].begin(), E[i].end());
  68. if(m == n-1)
  69. {
  70. dfs(1);
  71. return 0;
  72. }
  73. else
  74. {
  75. for(int i = 1; i <= m; i++)
  76. {
  77. TOT = 0, CUTu = u[i], CUTv = v[i];
  78. memset(VIS, 0, sizeof(VIS));
  79. DFS(1);
  80. if(TOT == n)
  81. {
  82. if(ANS[1] == 0)
  83. {
  84. for(int j = 1; j <= n; j++)
  85. ANS[j] = NOW[j];
  86. }
  87. else if(check())
  88. {
  89. for(int j = 1; j <= n; j++)
  90. ANS[j] = NOW[j];
  91. }
  92. }
  93. }
  94. for(int i = 1; i <= n; i++)
  95. printf("%d ",ANS[i]);
  96. return 0;
  97. }
  98. }

后记:

半退役选手回来的第二篇题解。

想想去年自己距离省一线差了10分,即使过去半年心里也依旧不是滋味。

DAY2考时想不起环套树来,考后出考场的一刹那就想到了可以N^2暴力断边。

其实环套树考前是讲过的,断边操作也是老师提到过的。

可是自己却总觉得环套树在NOIP比较冷门吧也没怎么去巩固练习。

可事后再去后悔再去抱怨终究是一点用都没有的。

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

  1. 洛谷 P5022 旅行——题解

    发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个 ...

  2. 洛谷P5022 旅行 题解 去环/搜索

    题目链接:https://www.luogu.org/problem/P5022 这道题目一开始看的时候没有思路,但是看到数据范围里面有一个: \(m = n-1\) 或 \(m = n\) ,一下子 ...

  3. Luogu P5022 旅行

    开始写复赛题了 先放张图纪念我惨烈的卡常之路 不说了,简直悲伤 题目链接 思路么..不想写了 Code //不要在意四十行超级加速,卡常用的 #include<bits/stdc++.h> ...

  4. 洛谷P5022 旅行 题解

    前面几个代码都是部分分代码,最后一个才是AC了的,所以最后一个有详细注释 安利一发自己的Blog 这是提高组真题,233有点欧拉回路的感觉. 题目大意: 一个 连通 图,双向边 ,无重边 , 访问图中 ...

  5. Luogu P5022 旅行 搜索+贪心

    好吧...一直咕..现在才过...被卡常卡到爆... 写的垃圾版本,$n^2$无脑删边..可以发现走出来的是棵树...更优秀的及数据加强版先咕着...一定写.qwq #include<cstdi ...

  6. 【题解】 P5022旅行

    [题解]P5022 旅行 当给定你一颗树的时候,这题就是一道送分题,凉心啊! 但是给定你一颗基环树呢? 暴力断环直接跑. 但是数据范围\(n\le 1000\) 乱做就完事了. 考场上这样想的,对于\ ...

  7. 【luogu P1137 旅行计划】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1137 topsort + DP #include <queue> #include <cs ...

  8. noip2012开车旅行 题解

    题目大意: 给出n个排成一行的城市,每个城市有一个不同的海拔.定义两个城市间的距离等于他们的高度差的绝对值,且绝对值相等的时候海拔低的距离近.有两个人轮流开车,从左往右走.A每次都选最近的,B每次都选 ...

  9. P5022 旅行

    原题链接  https://www.luogu.org/problem/P5022 本着快csp了,做点往年的NOIp的题试试水来着,没想到水这么深 难度还挺大的,耗了我一天的时间(可能是我太菜了) ...

随机推荐

  1. Winform下极简后台异步工作教程

    BackgroundWorker worker = new BackgroundWorker();//定义后台进程 worker.WorkerReportsProgress = true;//允许报告 ...

  2. 关于unique去重

    嗯.... unique这个东西也是一个冷门知识..... 但是在有时候它还是比较好用的东西... 下面就在详细代码中看unique是如何实际应用的....它主要是用于数组去重 #include< ...

  3. idea中使用Git对项目进行版本控制

  4. Ubuntu16.04安装Nvidia显卡驱动+Cuda8.0+Cudnn6.0

    一.安装Nvidia显卡驱动(gtx1050ti) 参考链接:Ubuntu16.04.2 LTS 64bit系统装机记录中的显卡驱动安装部分. 二.安装Cuda8.0 1.确定自己的系统信息,以Ubu ...

  5. DropDownList 不能绑定多个值错误!

    ListItem item = new ListItem("--请选择--",""); ddlstPurchaser.Items.Insert(0, item) ...

  6. python3 no module named PIL

    sudo apt-get install python3-imaging

  7. CentOS安装MySQL,(常规安装方式MySQL无法远程连接)

    转载自:https://blog.csdn.net/z13615480737/article/details/78906598 CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ...

  8. android 开发-文件存储之读写sdcard

    android提供对可移除的外部存储进行文件存储.在对外部sdcard进行调用的时候首先要调用Environment.getExternalStorageState()检查sdcard的可用状态.通过 ...

  9. win10命令行压缩zip文件

    1.下载winzip,下载winzip command line(官方) 2.使用命令 "C:\Program Files\WinZip\WZZIP.exe" C:\test\a. ...

  10. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...