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

\(NOIP2018 DAY2T1\)

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

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

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

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

60分code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5010;
struct edge{int to, next;
}e[maxn<<2];
int head[maxn], cnt, n, m;
bool vis[maxn];
void add(int u, int v)
{e[++cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;
}
void dfs(int x)
{if(vis[x]) return;vis[x] = 1;printf("%d ",x);int a[maxn], num = 0;for(int i = 1; i <= n; i++) a[i] = 0;for(int i = head[x]; i != -1; i = e[i].next)a[++num] = e[i].to;sort(a+1, a+1+num);for(int i = 1; i <= num; i++)dfs(a[i]);
}
int main()
{memset(head, -1, sizeof(head));scanf("%d%d",&n,&m);for(int i = 1; i <= m; i++){int u, v;scanf("%d%d",&u,&v);add(u, v);add(v, u);}dfs(1);return 0;
}

100分做法:

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

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

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

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

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

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

code:

#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 5010;
struct edge{int to, next;
}e[maxn<<2];
int head[maxn], cnt, n, m, u[maxn], v[maxn];
bool vis[maxn];
void add(int u, int v)
{e[++cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;
}
void dfs(int x)
{if(vis[x]) return;vis[x] = 1;printf("%d ",x);int a[maxn], num = 0;for(int i = 1; i <= n; i++) a[i] = 0;for(int i = head[x]; i != -1; i = e[i].next)a[++num] = e[i].to;sort(a+1, a+1+num);for(int i = 1; i <= num; i++)dfs(a[i]);
}
//=======================
vector<int> E[maxn];
int ANS[maxn], NOW[maxn], TOT, CUTu, CUTv;
bool VIS[maxn];
void DFS(int x)
{if(VIS[x]) return;VIS[x] = 1;NOW[++TOT] = x;for(int i = 0; i < E[x].size(); i++){int y = E[x][i];if((y == CUTv && x == CUTu) || (x == CUTv && y == CUTu)) continue;DFS(y);}
}
bool check()
{for(int i = 1; i <= n; i++){if(ANS[i] == NOW[i]) continue;if(ANS[i] > NOW[i]) return 1;if(ANS[i] < NOW[i]) return 0;}
}
int main()
{memset(head, -1, sizeof(head));scanf("%d%d",&n,&m);for(int i = 1; i <= m; i++){scanf("%d%d",&u[i],&v[i]);add(u[i], v[i]);add(v[i], u[i]);E[u[i]].push_back(v[i]);E[v[i]].push_back(u[i]);}for(int i = 1; i <= n; i++) sort(E[i].begin(), E[i].end());if(m == n-1){dfs(1);return 0;}else{for(int i = 1; i <= m; i++){TOT = 0, CUTu = u[i], CUTv = v[i];memset(VIS, 0, sizeof(VIS));DFS(1);if(TOT == n){if(ANS[1] == 0){for(int j = 1; j <= n; j++)ANS[j] = NOW[j];}else if(check()){for(int j = 1; j <= n; j++)ANS[j] = NOW[j];}}}for(int i = 1; i <= n; i++)printf("%d ",ANS[i]);return 0;}
}

后记:

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

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

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

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

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

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

转载于:https://www.cnblogs.com/MisakaAzusa/p/11002522.html

【luogu P5022 旅行】 题解相关推荐

  1. 【GDOI2014模拟】旅行 题解代码

    原题 Description 从前有一位旅者,他想要游遍天下所有的景点.这一天他来到了一个神奇的王国:在这片土地上,有n个城市,从1到n进行编号.王国中有m条道路,第i条道路连接着两个城市ai,bi, ...

  2. 【luogu P3946 ことりのおやつ】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h ...

  3. Luogu P3399 丝绸之路 题解

    原题传送门 题目背景 张骞于公元前138年曾历尽艰险出使过西域.加强了汉朝与西域各国的友好往来.从那以后,一队队骆驼商队在这漫长的商贸大道上行进,他们越过崇山峻岭,将中国的先进技术带向中亚.西亚和欧洲 ...

  4. 【HNOI2019】部分题简要题解

    题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...

  5. Luogu P1550 [USACO08OCT]打井Watering Hole

    0号结点:农夫John山泉天然矿泉水( by Luogu第一篇题解 #include<cstdio> #include<cstring> #include<algorit ...

  6. UOJ#198 [CTSC2016]时空旅行

    题目 UOJ#198 [CTSC2016]时空旅行 题解 QAQ允许我做一个悲伤的表情.这题题解真少.我要做一个造福人类的人. 首先呢可以看出,如果把每个时空当做一个节点,这是棵树,每个节点有一个添加 ...

  7. Luogu 2495 [SDOI2011]消耗战

    BZOJ 2286 传说中的虚树经典题. 放上我觉得讲的很好的Luogu置顶题解.       传送门 首先考虑一个暴力的$dp$,设$f_x$表示切断$x$的子树中的所有特殊点且保留$x$的最小代价 ...

  8. 洛谷P1035题解 [NOIP2002 普及组] 级数求和

    原文地址:https://luvletter.blog.luogu.org/p1035-ti-jie 题解 本体难度不大,但要注意计算和的时候要使用double类型,千万不能使用float类型,不然会 ...

  9. 洛谷P1055题解 [NOIP2008 普及组] ISBN 号码

    原文地址:https://luvletter.blog.luogu.org/p1055-ti-jie 题解 超级简单的一题,就是要注意输入和输出的分隔符的问题以及ASCII码中0~9这10个数字对应的 ...

最新文章

  1. 2019年的面试经验:Java程序员越来越悲催了!
  2. Oracle: 三、Oracle的隐藏事务与视图的创建
  3. 5G 承载网 — 前传、中传、回传
  4. 简单粗暴地理解js原型链–js面向对象编程
  5. adsl服务器客户端配置cisco_windows下,Kiwi_Syslog日志服务器的搭建
  6. 导入表格只有一行 帆软_万万没想到!把x个表格合合合合成一份,10分钟就搞定...
  7. android 百度地图 点标记偏移,百度地图设置中心点偏移(中心点不被页面其他元素遮挡)...
  8. Git、Github、Gitlab、Gitee、Git-ce的区别
  9. 2019.7.20js基础知识整理
  10. Win10中docker安装nuget服务器及使用
  11. python下载安装-Python下载安装
  12. 128 数据库基本操作
  13. qs.stringify()详情
  14. unity游戏开发毕设_请问自学Unity开发出一款游戏作为毕设大概要多久?
  15. 数字中国 · 青云科技:数字化转型过程中企业如何用好云计算?
  16. Norms in Matrix and Vector
  17. 剑指Offer题目详解(CPP、JAVA)
  18. linux下删除隐藏文件夹及子文件夹
  19. 关于Win10 64位Cadence16.6中OrCAD Capture CIS导网表出现ERROR无效指针的解决办法
  20. 如何用tick数据构建买入情绪因子

热门文章

  1. 怎么安装Scrapy框架以及安装时出现的一系列错误(win7 64位 python3 pycharm)
  2. hdu1540/poj2892 线段数区间合并
  3. hadoop1常见配置含义
  4. Phaser开源2d引擎 javascript/html5游戏框架
  5. 直击3.15 安防行业如何维护消费者权益
  6. 启动页面和各设备的宽高比及像素
  7. msbuild explorer
  8. 2013腾讯编程马拉松初赛(3月20日)
  9. TSQL中实现ORACLE的多列IN 多列匹配。
  10. 多股回测(backtrader+quantstats+akshare)