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,树)的更多相关文章

  1. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题

    A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...

  2. Codeforces Round #339 Div.2 A - Link/Cut Tree

    第一次正式参加常规赛想想有些小激动的呢 然后第一题就被hack了 心痛 _(:зゝ∠)_ tle点在于越界 因此结束循环条件从乘变为除 done //等等 这题没过总评 让我静静........ // ...

  3. 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 ...

  4. Codeforces Round #670 (Div. 2) D. Three Sequences 题解(差分+思维+构造)

    题目链接 题目大意 给你一个长为n的数组a,要你构造一个非严格单调上升的数组b和一个非严格单调下降的数组c,使得\(b_i+c_i=a_i\) 要你使这两个数组b,c中最大的元素最小,还有q次修改(q ...

  5. Codeforces Round #670 (Div. 2) B. Maximum Product (暴力)

    题意:有一长度为\(n\)的序列,求其中任意五个元素乘积的最大值. 题解:先排序,然后乘积能是正数就搞正数,模拟一下就好了. 代码: int t; ll n; ll a[N]; int main() ...

  6. Codeforces Round #670 (Div. 2) A. Subset Mex (贪心)

    题意:给你一长度为\(n\)的序列,将其分为两个集合,求两个集合中未出现的最小元素的最大值, 题解:用桶存一下每个元素的个数,两次枚举\([1,100]\),找出两个最小值即可. 代码: int t; ...

  7. 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 ...

  8. 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 ...

  9. 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. ...

随机推荐

  1. 一文带你学会AQS和并发工具类的关系

    1. 存在的意义   AQS(AbstractQueuedSynchronizer)是JAVA中众多锁以及并发工具的基础,其底层采用乐观锁,大量使用了CAS操作, 并且在冲突时,采用自旋方式重试,以实 ...

  2. Java基础学习总结笔记

    Java基础 Java常用内存区域 栈内存空间:存储引用堆内存空间的地址 堆内存空间:保存每个对象的具体属性内容 全局数据区:保存static类型的属性 全局代码区:保存所有的方法定义 修饰符 权限修 ...

  3. 内存性能测试 Memtester+mbw

    Memtester简单介绍 Memtester主要是捕获内存错误和一直处于很高或者很低的坏位, 其测试的主要项目有随机值,异或比较,减法,乘法,除法,与或运算等等. 通过给定测试内存的大小和次数, 可 ...

  4. 【Linux】rsync 守护进程的配置

    环境 centos7.2 1.首先查看是否安装rsync的相关包 rpm -qa | grep rsync rsync-3.1.2-4.el7.x86_64 如果没安装就yum install rsy ...

  5. Java中的NIO进阶

    目录 前言 NIO与多线程 Readable和Writeable的空触发 请求与返回的处理 事件的处理机制 NIO多线程使用的一个例子 前言 之前一篇文章简单介绍了NIO,并附了一个简单的例子,但是自 ...

  6. oracle_fdw的安装和使用

    1.下载instant oracle client 下载网址:https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html ...

  7. VMware下安装Ubantu 18.04

    一.VIM安装及配置 1.安装VIM sudo apt-get install vim 二.拼音输入法以及搜狗拼音输入法安装 1.安装Fcitx输入框架 sudo apt-get install fc ...

  8. [Usaco2015 dec]Breed Counting

    原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...

  9. 1.5V升5V芯片,1.5V升5V电路图规格书

    常用的 5号,7号等 1.5V 干电池满电电压在 1.6V 左右,干电池输出耗电电压在 1V.适用PW5100,在 0.9V 时还能输出,彻底榨干干电池的电量. 1.5V 升5V 的芯片:PW5100 ...

  10. redis修改requirepass 参数 改密码

    1. 不重启redis如何配置密码? a. 在配置文件中配置requirepass的密码(当redis重启时密码依然有效). # requirepass foobared  ->  修改成 :  ...