链接:JXCPC A-Cotree

Avin has two trees which are not connected. He asks you to add an edge between them to make them connected while minimizing the function ∑i=1n−1∑j=i+1ndistance(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}distance(i,j)i=1∑n−1​j=i+1∑n​distance(i,j), where dis(i, j) represents the number of edges of the path from i to j. He is happy with only the function value.

Input

The first line contains a number n (2<=n<=100000). In each of the following n−2 lines, there are two numbers u and v, meaning that there is an edge between u and v. The input is guaranteed to contain exactly two trees.

Output

Just print the minimum function value.

Sample Input

3
1 2

Sample Output

4


题意:

给出两棵树(共n个结点,即n-2条边),加一条边连接两棵树使得得到的新树上结点两两距离和最小。即∑i=1n−1∑j=i+1ndistance(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}distance(i,j)i=1∑n−1​j=i+1∑n​distance(i,j)最小。(两结点的距离即 i -> j 路径上边的数量)


分析:

树的重心的性质:

树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。

所以要先求得两棵树的重心(Click here),然后连接重心后求结点的两两距离和即可。

任意一条边对距离和的贡献 = 左端结点个数 * 右端结点个数 * 边权

该题直接令边权 = 1即可。

注意在求两棵树的重心前要先得到两棵树上结点的个数。


以下代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1e5+50;
const int maxm=2e5+50;
struct edge
{int u;int v;int next;
}e[maxm];
int head[maxn],cnt;
void addedge(int u,int v)
{e[cnt].u=u;e[cnt].v=v;e[cnt].next=head[u];head[u]=cnt++;
}
int n;
bool vis[maxn];
int tot;
void DFS0(int u)
{if(vis[u])return;vis[u]=true;tot++;for(int i=head[u];i!=-1;i=e[i].next)DFS0(e[i].v);
}
int p,minimum;
int DFS1(int u,int pre,int N)
{int sum=0,max_sub=0;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(v==pre)continue;int t=DFS1(v,u,N);max_sub=max(max_sub,t);sum+=t;}max_sub=max(max_sub,N-sum-1);if(max_sub<minimum){minimum=max_sub;p=u;}return sum+1;
}
LL ans;
int DFS2(int u,int pre)
{int sum=0;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(v==pre)continue;int t=DFS2(v,u);ans+=(1LL*t)*(1LL*(n-t));sum+=t;}return sum+1;
}
int main()
{memset(head,-1,sizeof(head));cnt=0;scanf("%d",&n);for(int i=1;i<=n-2;i++){int u,v;scanf("%d %d",&u,&v);addedge(u,v);addedge(v,u);}int n1,n2,s1,s2;for(int i=1;i<=n;i++){if(!vis[i]){tot=0;DFS0(i);    //分别得到两棵树的源点s和结点个数nif(i==1){s1=i;n1=tot;}else{s2=i;n2=tot;}}}int g1,g2;//得到树1的重心g1minimum=INF;DFS1(s1,-1,n1);g1=p;//得到树2的重心g2minimum=INF;DFS1(s2,-1,n2);g2=p;//连接g1、g2addedge(g1,g2);addedge(g2,g1);//算出距离和ans=0;DFS2(1,-1);printf("%lld\n",ans);return 0;
}

2019CCPC-江西省赛 A-Cotree(树的重心)相关推荐

  1. 2019CCPC江西省赛(重现赛)| 题目 题解

    2019CCPC江西省赛(重现赛)在hdu进行 据说很简单 因为现场有多个队伍AK 然鹅 我在40分钟内AC两题之后 就卡在概率题 (后来就没做题目emmm) 先放官方题解 然后慢慢补题 嗯! 题目: ...

  2. 2019CCPC江西省赛

    这次CCPC只拿一个银奖,很可惜,自己是银的第一名,运气真不怎么样,竟然是个银首,说实话,此次比赛并没有做什么准备,因为刚好是考完试之后就开始比赛了,一个月的时间都在赶课设 复习课程知识,一个月都没打 ...

  3. 2019CCPC网络赛 1002 HDU 6703(权值线段树)

    2019CCPC网络赛 1002 HDU 6703(权值线段树) 思路:用权值线段树存题目给的数据后,2操作就是求权值线段树中大于等于k的部分中,靠近左端点的第一个大于r的值(这个求出来的只是原序列中 ...

  4. 2021CCPC江西省赛题解ABGHIJKL

    2021CCPC江西省赛题解ABGHIJKL K. Many Littles Make a Mickle 题意 有 t ( 1 ≤ t ≤ 100 ) t\ \ (1\leq t\leq 100) t ...

  5. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  6. 【树形DP】树的重心详解+多组例题详解

    目录 定义: 性质: 算法分析: POJ 1655 Balancing Act(求重心) POJ 3107 Godfather P1364 医院设置(树形DP) 定义: 树的重心也叫树的质心.对于一棵 ...

  7. 树形dp——树的重心(2) 代码调试理解

    和树的最大独立问题类似,先任选一个结点作为根节点,把无根树变成有根树,然后设d(i)表示以i为根的子树的结点的个数.不难发现d(i)=∑d(j)+1,j∈s(i).s(i)为i结点的所有儿子结点的编号 ...

  8. POJ-1655 Balancing Act 树的重心

    题意:完全符合树的重心:即找到一个点,其所有的子树中最大的子树节点最少. 代码如下: #include <cstdlib> #include <cstring> #includ ...

  9. 幽暗统领 树的重心 牛客白月赛44

    链接:https://ac.nowcoder.com/acm/contest/11221/F 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52 ...

最新文章

  1. (zt)Web 2.0奔路进行时
  2. 悠然乱弹:我的开源观
  3. R语言基于可视化进行多变量离群(Mulltivariate outliers)点检测识别:散点图可视化多变量离群点、模型平滑多变量异常检测、使用平行坐标图查看钻石数据集中的异常值
  4. 案例驱动python编程入门-python监听socket客户端连接(驱动串口屏幕)
  5. boost::mp11::mp_replace_front相关用法的测试程序
  6. 第三次学JAVA再学不好就吃翔(part113)--对象操作流
  7. Angular 路由时如何在 Component 之间传递参数
  8. dynamodb分页查询_使用DynamoDBMapper查询DynamoDB项目
  9. matlab ode45 二阶微分,matlab关于ode45解二阶微分方程的困惑
  10. Python中的异常处理Try...except...finally的使用的简单理解
  11. 使用cisco 2500路由器实现ADSL接入
  12. opencv 图像轮廓特征 图像面积,轮廓周长,外接矩形、最小外接矩形、最小外接圆、拟合椭圆
  13. jdk配置环境变量的方法
  14. python代码测试 vim_使用tmux+vim发送测试代码行的键绑定?
  15. android root测试,[原创]安卓逆向之绕过root检测的四种姿势
  16. WEB API 接口签名sign验证入门与实战
  17. xmapp_mysql端口冲突解决
  18. 黑月教主去水印软件_推荐大家一款免费去水印软和视频编辑软件—无水印剪辑APP...
  19. 【17.12.22.B】
  20. 锂电池电量百分比计算_锂电池充放电理论及电量计算方法详解

热门文章

  1. 关于AndroidStudio中Gradle文件引发的问题导致HelloWorld无法运行的解决方法
  2. mysql使用技巧之比较两个表是否有不同的数据
  3. 5G破题 成本压力待解
  4. STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置
  5. JavaScript的分支语句—— IF语句 解释及基础应用方式
  6. 【GitGitHub - 11】:Git合并分支
  7. 光模块的核心器件包含哪些?
  8. html语言代码大全,菜鸟快速读懂HTML语言_html
  9. 分布式架构——HTTP 协议(一)
  10. 搭建全国离线地图数据服务器解决方案