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. ...
随机推荐
- MySQL的索引优化分析(一)
一.SQL分析 性能下降.SQL慢.执行时间长.等待时间长 查询语句写的差 索引失效关联查询太多join(设计缺陷) 单值索引:在user表中给name属性创建索引,create index idx_ ...
- Spring源码深度解析之事务
Spring源码深度解析之事务 目录 一.JDBC方式下的事务使用示例 (1)创建数据表结构 (2)创建对应数据表的PO (3)创建表和实体之间的映射 (4)创建数据操作接口 (5)创建数据操作接口实 ...
- 断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)
检查json_key_value: 检查: requests.py # -*- coding: utf-8 -*-#@File :demo_04.py#@Auth : wwd#@Time : 2020 ...
- 浅入深出了解XXE漏洞
环境搭建 https://github.com/c0ny1/xxe-lab 为了更深入的理解,我准备理论和实际相结合的了解XXE! 浅谈XML 初识XML 一个好的代码基础能帮助你更好理解一类漏洞,所 ...
- Centos7.4 小白式安装(初学)
虚拟机安装Centos7.4系统 适用人群(初学者) 下载Centos7.4镜像 https://pan.baidu.com/s/1NtjfdHV3OWAvfDj5vrR7HQ 提取码:hzzw 虚 ...
- ElasticSearch7.2简单命令实操(postman版)
使用postman访问操作ElasticSearch数据库,数据格式均为json 目录 使用postman访问操作ElasticSearch数据库,数据格式均为json 一.集群设置 1.查看集群设置 ...
- Flask扩展点总结(信号)
信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 根据flask项目的请求流程来进行设置扩展点 1.中间件 from ...
- 转 6 jmeter元件的作用域与执行顺序
6 jmeter元件的作用域与执行顺序 元件的作用域 配置元件(config elements)会影响其作用范围内的所有元件.前置处理程序(Per-processors)在其作用范围内的每一个sa ...
- Python+Selenium+Unittest实现PO模式web自动化框架(3)
1.Outputs目录下的具体目录功能 2.logs目录 logs目录是用于存放log日志的一个目录. 2.reports目录 reports目录是用于存放测试报告的. 3.screenshots目录 ...
- 网易新闻App架构重构实践:DDD正走向流行
网易新闻App架构重构实践:DDD正走向流行 https://mp.weixin.qq.com/s/FdwrT_xn3CQqpWoRVBttvQ 小智 InfoQ 2020-05-14 作者 | 小智 ...