Codeforces Round #670 (Div. 2) C. Link Cut Centroids (dfs,树)
C. Link Cut Centroids
Fishing Prince loves trees, and he especially loves trees with only one centroid. The tree is a connected graph without cycles.
A vertex is a centroid of a tree only when you cut this vertex (remove it and remove all edges from this vertex), the size of the largest connected component of the remaining graph is the smallest possible.
For example, the centroid of the following tree is 22, because when you cut it, the size of the largest connected component of the remaining graph is 22 and it can't be smaller.

However, in some trees, there might be more than one centroid, for example:

Both vertex 11 and vertex 22 are centroids because the size of the largest connected component is 33 after cutting each of them.
Now Fishing Prince has a tree. He should cut one edge of the tree (it means to remove the edge). After that, he should add one edge. The resulting graph after these two operations should be a tree. He can add the edge that he cut.
He wants the centroid of the resulting tree to be unique. Help him and find any possible way to make the operations. It can be proved, that at least one such way always exists.
Input
The input consists of multiple test cases. The first line contains an integer tt (1≤t≤1041≤t≤104) — the number of test cases. The description of the test cases follows.
The first line of each test case contains an integer nn (3≤n≤1053≤n≤105) — the number of vertices.
Each of the next n−1n−1 lines contains two integers x,yx,y (1≤x,y≤n1≤x,y≤n). It means, that there exists an edge connecting vertices xx and yy.
It's guaranteed that the given graph is a tree.
It's guaranteed that the sum of nn for all test cases does not exceed 105105.
Output
For each test case, print two lines.
In the first line print two integers x1,y1x1,y1 (1≤x1,y1≤n1≤x1,y1≤n), which means you cut the edge between vertices x1x1 and y1y1. There should exist edge connecting vertices x1x1 and y1y1.
In the second line print two integers x2,y2x2,y2 (1≤x2,y2≤n1≤x2,y2≤n), which means you add the edge between vertices x2x2 and y2y2.
The graph after these two operations should be a tree.
If there are multiple solutions you can print any.
题意:有一颗树,现在让你删去一条边再连一条边(两条边可以相同),使得操作后树的重心是唯一的.
题解:这题如果知道树的重心的性质的话,其实就是一个结论就解决了.
这里直接贴个链接吧.
https://www.cnblogs.com/zjl192628928/p/11155816.html
了解了之后,这题我们先去找树的重心,如果只有一个,那么我们可以随便删一条边再连回去,否则如果有两个重心,那么我们只要把其中一个重心的没有连另外一个重心的子节点删去,连到另外一个重心上面就可以了.
代码:
int t;
int n;
int a,b;
vector<int> v[N];
int son[N],mx[N];
int mi; void dfs(int u,int fa){
son[u]=1;
for(auto w:v[u]){
if(w==fa) continue;
dfs(w,u);
son[u]+=son[w];
mx[u]=max(mx[u],son[w]);
}
mx[u]=max(mx[u],n-son[u]);
mi=min(mi,mx[u]);
} int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>n;
mi=INF;
for(int i=1;i<n;++i){
cin>>a>>b;
v[a].pb(b);
v[b].pb(a);
}
dfs(1,0);
int cnt1=0;
int cnt2=0;
for(int i=1;i<=n;++i){
if(mx[i]==mi){
if(!cnt1) cnt1=i;
else cnt2=i;
}
}
if(cnt1 && !cnt2){
cout<<a<<" "<<b<<endl;
cout<<a<<" "<<b<<endl;
}
else{
for(auto w:v[cnt1]){
if(w!=cnt2){
cout<<cnt1<<" "<<w<<endl;
cout<<cnt2<<" "<<w<<endl;
break;
}
}
}
for(int i=1;i<=n;++i){
v[i].clear();
son[i]=0;
mx[i]=0;
}
} return 0;
}
Codeforces Round #670 (Div. 2) C. Link Cut Centroids (dfs,树)的更多相关文章
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...
- Codeforces Round #339 Div.2 A - Link/Cut Tree
第一次正式参加常规赛想想有些小激动的呢 然后第一题就被hack了 心痛 _(:зゝ∠)_ tle点在于越界 因此结束循环条件从乘变为除 done //等等 这题没过总评 让我静静........ // ...
- Codeforces Round #670 (Div. 2) 深夜掉分(A - C题补题)
1406A. Subset Mex https://codeforces.com/contest/1406/problem/A Example input 4 6 0 2 1 5 0 1 3 0 1 ...
- Codeforces Round #670 (Div. 2) D. Three Sequences 题解(差分+思维+构造)
题目链接 题目大意 给你一个长为n的数组a,要你构造一个非严格单调上升的数组b和一个非严格单调下降的数组c,使得\(b_i+c_i=a_i\) 要你使这两个数组b,c中最大的元素最小,还有q次修改(q ...
- Codeforces Round #670 (Div. 2) B. Maximum Product (暴力)
题意:有一长度为\(n\)的序列,求其中任意五个元素乘积的最大值. 题解:先排序,然后乘积能是正数就搞正数,模拟一下就好了. 代码: int t; ll n; ll a[N]; int main() ...
- Codeforces Round #670 (Div. 2) A. Subset Mex (贪心)
题意:给你一长度为\(n\)的序列,将其分为两个集合,求两个集合中未出现的最小元素的最大值, 题解:用桶存一下每个元素的个数,两次枚举\([1,100]\),找出两个最小值即可. 代码: int t; ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分
D. Happy Tree Party Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...
- Codeforces Round #370 (Div. 2) E. Memory and Casinos 线段树
E. Memory and Casinos 题目连接: http://codeforces.com/contest/712/problem/E Description There are n casi ...
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...
随机推荐
- redis存json数据时选择string还是hash
redis存json数据时选择string还是hash 我们在缓存json数据到redis时经常会面临是选择string类型还是选择hash类型去存储.接下来我从占用空间和IO两方面来分析这两种类型的 ...
- 【RAC】安装cluster软件 在节点2执行root.sh脚本
安装cluster软件 在节点2执行root.sh脚本 报错如下: Running vipca(silent) for configuring nodeapps /db/oracle/product ...
- mysql InnoDB架构
1.InnoDB的磁盘结构 1)系统表空间 2)用户表空间 3)rodolog 文件组 4)磁盘文件逻辑结构 文件->段->区->页->行 InnoDB对数据的存取是以页为单位 ...
- 基于scrapy框架的分布式爬虫
分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...
- uni-app开发经验分享十一: uniapp iOS云打包修改权限提示语
打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝.Apple的原则是,如果一个app想要申请用户同意某个隐私信息访问 ...
- 笔记 | pandas之时间序列学习随笔1
1. 时间序列自动生成 ts = pd.Series(np.arange(1, 901), index=pd.date_range('2010-1-1', periods=900)) 最终生成了从20 ...
- 百度文库Word下载器
最近我妈的文库VIP用完了,但还有很多资源要下载,于是我便在网上找下载工具. 总算找到个完美的!(虽然没界面) 既然没界面,那就自己写一个呗! 原作者 该程序的下载和写入部分由地球守卫者制作 原文链接 ...
- Docker数据目录迁移解决方案
场景 在docker的使用中随着下载镜像越来越多,构建镜像.运行容器越来越多, 数据目录必然会逐渐增大:当所有docker镜像.容器对磁盘的使用达到上限时,就需要对数据目录进行迁移. 如何避免: 1. ...
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- HA工作机制及namenode向QJM写数据流程
HA工作机制 (配置HA高可用传送门:https://www.cnblogs.com/zhqin/p/11904317.html) HA:高可用(7*24小时不中断服务) 主要的HA是针对集群的mas ...