2021 ICPC Southeastern Europe Regional Contest 树上dfs+思维
|–>传送门<–|
题目大意
给定一颗nnn个节点的树,可以从任意一个点开始dfsdfsdfs,求最小字典序的后续遍历。
题解
首先,对于字典序最小的要求,我们一定是从叶结点中的最小值开始遍历的。我们可以记录每个节点的度,然后倒序寻找度为111的节点。
然后,我们对当前节点uuu进行讨论,我们有两种策略:
- 认为当前节点不是根节点:先将子树按最小权排序。如果发现当前子树中的最大最小值小于uuu,那么显然此时输出uuu不是最优策略,所以此时应当先dfsdfsdfs第kkk个子树(当作父节点向上走),再将uuu加入答案。否则就先遍历前k−1k - 1k−1个子树,然后将uuu加入答案,再遍历最后一个子树;
- 认为当前节点是根节点:先将子树按最小权排序,然后按照最小叶序依次dfsdfsdfs子树,最后将uuu加入答案。
可以发现在dfsdfsdfs时需要记录搜索的顺序,从而确定是否可以将子树作为父节点向上走。
#include <bits/stdc++.h>
#define int long long
using namespace std;const int N = 2e5 + 10, INF = 1e9 + 7;
vector<int> g[N], ans;#define pii pair<int, int>
#define mkp make_pair
#define fir first
#define sec secondint deg[N], w[N];inline void solve(){ans.clear();int n = 0; std::cin >> n;for(int i = 1; i <= n; i++) deg[i] = 0;for(int i = 0; i <= n + 1; i++) g[i].clear();for(int i = 1, u, v; i <= n - 1; i++){cin >> u >> v;g[u].emplace_back(v);g[v].emplace_back(u);deg[u]++, deg[v]++;}function<void(int, int)> getmin = [&](int u, int fa){bool flag = true;w[u] = INF;for(auto nxt : g[u]){if(nxt == fa) continue;flag = false;getmin(nxt, u);w[u] = min(w[u], w[nxt]);}if(flag) w[u] = u;};function<void(int, int, int)> dfs = [&](int u, int fa, int dir){vector<pii> sot;for(auto v : g[u]){if(v == fa) continue;sot.emplace_back(mkp(w[v], v));}if(!sot.size()) { ans.emplace_back(u); return; }sort(sot.begin(), sot.end());if(dir == 0){for(auto x : sot) dfs(x.sec, u, 0);ans.emplace_back(u);} else {for(int i = 0; i < sot.size() - 1; i++) dfs(sot[i].sec, u, 0);if(u > sot.back().fir) dfs(sot.back().sec, u, 0), ans.emplace_back(u);else ans.emplace_back(u), dfs(sot.back().sec, u, 1);}}; int st = 0;for(int i = n; i >= 1; --i) if(deg[i] == 1) st = i;getmin(st, 0);dfs(st, 0, 1);for(auto x : ans) cout << x << ' ';cout << "\n";
}signed main(){ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);int t = 0; std::cin >> t;while(t--) solve();return 0;
}
2021 ICPC Southeastern Europe Regional Contest 树上dfs+思维相关推荐
- 2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包)
2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包) 链接 题意:给出一个n个节点的树(n≤3000n\le3000n≤300 ...
- 2021 ICPC Southeastern Europe Regional Contest(更新至六题)
2021 ICPC Southeastern Europe Regional Contest A题签到 A. King of String Comparison 题意:给两个字符串,找出有多少对(l, ...
- 2021 ICPC Southeastern Europe Regional Contest ABFGJKLN
|–>传送门<–| A. King of String Comparison 双指针 给定字符串AAA和BBB,计算满足Asub[l,r]A_{sub[l, r]}Asub[l,r]字典 ...
- 【题目记录】——The 2021 ICPC Asia Jinan Regional Contest
文章目录 C Optimal Strategy 组合数 H Game Coin K Search For Mafuyu 欧拉序列 题目集地址 The 2021 ICPC Asia Jinan Regi ...
- ICPC Central Europe Regional Contest 2019 K. K==S(AC自动机+矩阵快速幂)
Progressive hard octave rock tunes (so-called "phorts") are written using a specifific mus ...
- 2020-2021 ICPC Southeastern European Regional Programming Contest (SEERC 2020)
2020-2021 ICPC Southeastern European Regional Programming Contest (SEERC 2020) B. Reverse Game 题目描述: ...
- The 2019 ICPC Asia Shanghai Regional Contest
The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...
- 2018 ICPC Asia Jakarta Regional Contest
2018 ICPC Asia Jakarta Regional Contest 题号 题目 知识点 难度 A Edit Distance B Rotating Gear C Smart Thief D ...
- The 2021 ICPC Asia Regionals Online Contest (I)
The 2021 ICPC Asia Regionals Online Contest (I) 写了一晚上,日- 文章目录 一. A Busiest Computing Nodes 二.D Edge ...
最新文章
- 链表问题16——单链表的选择排序(python版本)
- SAP QM 权限控制可以到Inspection Type上
- 关于ie6下提交上传表单的注意事项
- 微软推出了一款能帮你“做题”的数学应用
- mysql数据库表的类型介绍,mysql数据库表的类型介绍
- matlab 求向量的交集_从零开始的matlab学习笔记——(16)函数绘图
- Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)
- print( )函数调用——pytnon小练
- 计算机录入技术五笔输入法教案,五笔打字教案
- CSS背景颜色之奇技淫巧
- 嵌入式开发系统的简介
- cmd查看自己的CPU参数
- C语言确定某年星期六,c语言 怎么算某年某月某日是星期几啊?
- 网页yy语音(歪歪语音) 网页版
- python qt是什么_初识Python与Qt
- 什么是802.11ac和802.11ac Wave2
- 电脑技术分享:电脑怎样录制桌面视频
- 农用地包括哪些地类_农用地、基本农田、建设用地,不同类型的土地性质要怎么利用...
- 基于SSH的计算机在线测评考试系统
- 14 EXCEL仪表盘制作1