UVa1670/LA5920 Kingdom Roadmap

2024-08-27 00:20
文章标签 uva1670 la5920 kingdom roadmap

本文主要是介绍UVa1670/LA5920 Kingdom Roadmap,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UVa1670/LA5920 Kingdom Roadmap

  • 题目链接
  • 题意
  • 分析
  • AC 代码

题目链接

  本题是2011年icpc欧洲区域赛东北欧赛区的K题

题意

  输入一个n(n≤100000)个结点的树,添加尽量少的边,使得任意删除一条边之后图仍然连通。如下图所示,最优方案用虚线表示。
Kingdom Roadmap

分析

  首先统计叶结点数c,即可知道答案是 ⌈ c 2 ⌉ \lceil\frac{c}2\rceil 2c,然后将叶结点两两配对连边即可,不过注意要优先将不在同一个枝杈的两叶结点配对(看下图就能理解)。
Kingdom Roadmap
  可以遍历每个叶结点找出它连接到的枝杈点,这样就统计出了每个枝杈点有哪些叶结点,然后对每一个枝杈点先拿出一个叶结点做配对,其他叶结点存着等后面再任意配对即可。
  还可以任取一个非叶结点作为根对树做dfs遍历,遍历过程遇到叶结点就存起来,将存起来的叶结点看成循环队列则可以发现属于同一个枝杈点的叶结点处在队列连续的一段。这时候就很容易对叶结点做配对了:将第 i i i个叶结点和第 i + ⌊ c 2 ⌋ i+\lfloor\frac{c}2\rfloor i+2c个叶结点配对连边。

AC 代码

  本题UVa数据出问题了,提交必WA,Codeforces上对应的题目是GYM 100085K,可提交(先加上freopen,输入自 kingdom.in ,输出到 kingdom.out)。

  按枝杈点点对叶结点做分类的方法

#include <iostream>
#include <vector>
using namespace std;#define N 100100
int q[N], n; vector<int> g[N], gg[N];void solve() {int c = 0;for (int i=1; i<=n; ++i) g[i].clear(), gg[i].clear();for (int i=1, u, v; i<n; ++i) cin >> u >> v, g[u].push_back(v), g[v].push_back(u);for (int i=1; i<=n; ++i) if (g[i].size() == 1) {int u = g[i][0], p = i, v; ++c;while (g[u].size() == 2) v = u, u = g[u][0]+g[u][1]-p, p = v;gg[u].push_back(i);}cout << (c+1)/2 << endl;int head = 0, tail = 0;for (int i=1; i<=n; ++i) {int s = gg[i].size();if (s>1 && head<tail) cout << q[head++] << ' ' << gg[i].back() << endl, --s;for (int j=0; j<s; ++j) q[tail++] = gg[i][j];}for (int i=head+1; i<tail; i+=2) cout << q[i-1] << ' ' << q[i] << endl;if (c&1) cout << q[0] << ' ' << q[tail-1] << endl;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n) solve();return 0;
}

  dfs法

#include <iostream>
#include <vector>
using namespace std;#define N 100100
int q[N], n, c; vector<int> g[N];void dfs(int u, int p = -1) {if (g[u].size() == 1) q[c++] = u;for (int i=g[u].size()-1, v; i>=0; --i) if ((v = g[u][i]) != p) dfs(v, u);
}void solve() {c = 0;for (int i=1; i<=n; ++i) g[i].clear();for (int i=1, u, v; i<n; ++i) cin >> u >> v, g[u].push_back(v), g[v].push_back(u);for (int i=1; i<=n; ++i) if (g[i].size() > 1) {dfs(i); break;}cout << (c+1)/2 << endl;for (int i=0, m=c>>1; i<m; ++i) cout << q[i] << ' ' << q[i+m] << endl;if (c&1) cout << q[0] << ' ' << q[c-1] << endl;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n) solve();return 0;
}

这篇关于UVa1670/LA5920 Kingdom Roadmap的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110103

相关文章

hdu4777 Rabbit Kingdom 离线树状数组 求询问区间内的区间数

题意:询问区间内有多少个数与区间中其他的数都互质 分析:易得,一个区间内的数的个数减去,与其他数不互质的数即可——即离当前数i左边最近的不互质的数的位置(设为L[i])和右边最近的不互质的数的位置(设为R[i])有一个在区间[L,R]内。那么问题就变成统计:1.区间[L,R]中有多少个数的L[i]或R[i]在区间[L,R]内。2.多少个数的L[i]且R[i]在区间[L,R]内。对于每个询问,答案

OpenCV Tutorial roadmap

http://computer-vision-talks.com/opencv-tutorial-roadmap/          computer vision talks All you want and should know about computer vision is here Home  »  OpenCV Tutorial roadmap O

hdu 5583 Kingdom of Black and White(高效)

题目链接:hdu 5583 Kingdom of Black and White 代码 #include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e5 + 5;typedef long long ll;char str[maxn];int L[maxn][2

Unity3d 在 twitter 转载(周报) UniteLA大会 和 Unity2019版本的Roadmap路线图

选自过去1~2周的内容: https://twitter.com/unity3d     0) 快人一步,看未来,    Unity2019 版本的Roadmap路线图。  Unity 2019 Product  Roadmap  https://www.dropbox.com/s/j9sga9giybo4l7g/UniteLA-2018-Roadmap.pdf?dl=0       视

RFC 6071: IP Security (IPsec) and Internet Key Exchange (IKE) Document Roadmap

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/96882d1fb67b4383bc77c4dd421f7b

Java-字符集和字符编码-roadmap

1 需求 2 接口 3 示例 4 参考资料 「烫烫屯屯锟斤拷」揭秘ASCII、GBK、UTF-8,B站独家,一听就懂_哔哩哔哩_bilibili 非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有_哔哩哔哩_bilibili 你懂乱码吗?锟斤拷烫烫烫(详解ASCII、Unicode、UTF-32、UTF-8编

【Roadmap to Learn LLM】Intro to Large Language Models

by Andrej Karpathy 文章目录 什么是LLM模型训练微调阶段llm的发展方向LLM安全参考资料 什么是LLM Large Language Model(LLM)就是两个文件,一个是模型参数文件,一个是用于运行模型的代码文件 模型训练 一个压缩的过程,将所有训练数据压缩到神经网络的权重/参数中。但这个压缩过程又和.zip的压缩不同,.zip的压缩过程

Middle Kingdom of Egypt(中王国时期)

Middle Kingdom of Egypt(中王国时期) 储物罐子 地理 Jietu20190402-162434@2x.jpg 介绍 埃及中部王国(也称为统一时期)是古埃及历史上经过一段称为第一中间阶段的政治分裂的时期。中王国时期从公元前2050年左右持续到公元前1710年左右。 文物 Jietu20190402-162706@2x.jp

Rabbit Kingdom HDU - 4777 (离线处理+树状数组)

Rabbit Kingdom  HDU - 4777  题意:给定n个数a[i] ( 1=< i <=n) 现在给定m个询问,每个询问一个区间[l,r],问该区间有多少个数与其它所有的数互素。 1 =< n,m,a[i] <= 200000 思路:对于每个数a[i] 处理后可以得到一个区间[L,R]在这个区间里面,a[i]对所有包含i的[L,R]的子区间都能贡献一个结果。每个a[i] 得到

Linova and Kingdom

Linova and Kingdom 题目来源:Codeforces Round #635 (Div. 2) C题 Writing light novels is the most important thing in Linova’s life. Last night, Linova dreamed about a fantastic kingdom. She began to write