【HDU - 6567】Cotree(树形dp,思维)

题干:

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 ∑ni=1∑nj=i+1dis(i,j)∑i=1n∑j=i+1ndis(i,j), where dis(i,j)dis(i,j) represents the number of edges of the path from ii to jj. He is happy with only the function value.

Input

The first line contains a number n (2<=n<=100000)n (2<=n<=100000). In each of the following n−2n−2 lines, there are two numbers uu and vv, meaning that there is an edge between uuand vv. 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条边,已知这是两棵树。让你在每棵树中任选一点,加一条边,使得变成一棵树,要求使得树中任意两点的距离之和最小,求出这个最小值。

解题报告:

以边为单位统计贡献就行了,注意最后统计的是任意两点之间的距离和,而不是第一棵树的任意一点和第二棵树的任意一点之间的距离和。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int n;
vector<int> vv[MAX];
int f[MAX];
ll dp[MAX],size[MAX];
int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]);
}
void dfs1(int cur,int fa) {int up = vv[cur].size();size[cur] = 1;for(int i = 0; i<up; i++) {int v = vv[cur][i];if(v == fa) continue;dfs1(v,cur);size[cur] += size[v];dp[cur] += dp[v] + size[v];}
}
void dfs2(int cur,int fa,ll allsize) {int up = vv[cur].size();for(int i = 0; i<up; i++) {int v = vv[cur][i];if(v == fa) continue;dp[v] += dp[cur]-dp[v]-2*size[v]+allsize; 
//		dp[v] += size[cur] - size[v] + dp[cur] - dp[v];大错特错啊,可以再想想dfs2(v,cur,allsize);}
}
int main()
{cin>>n;for(int i = 1; i<=n; i++) f[i] = i;for(int u,v,i = 1; i<=n-2; i++) {scanf("%d%d",&u,&v);vv[u].pb(v),vv[v].pb(u);u=getf(u),v=getf(v);f[v] = u;}vector<int> rt;for(int i = 1; i<=n; i++) {if(f[i] == i) rt.pb(i);}dfs1(rt[0],-1);dfs2(rt[0],-1,size[rt[0]]);dfs1(rt[1],-1);dfs2(rt[1],-1,size[rt[1]]);ll mi0 = 1e18,mi1=1e18;ll tmp = 0; for(int i = 1; i<=n; i++) {if(getf(f[i]) == getf(f[rt[0]])) mi0 = min(mi0,dp[i]);else mi1 = min(mi1,dp[i]);tmp += dp[i];}printf("%lld\n",tmp/2 + size[rt[0]]*size[rt[1]]+mi0*size[rt[1]]+mi1*size[rt[0]]);return 0 ;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步编写操作系统 27 处理器微架构之流水线简介

了解处理器内部硬件架构&#xff0c;有助于理解软件运行原理&#xff0c;因为这两者本身相辅相成&#xff0c;相互依存。就像枪和狙击手&#xff0c;枪的操作和外形设计都是要根据人体工学&#xff0c;让人不仅操作容易&#xff0c;而且携带也要轻便&#xff0c;做到能随时射出…

【2019icpc南京站网络赛 - F】Greedy Sequence(思维,贪心构造,STLset)

题干&#xff1a; Youre given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], construct a sequence s_isi​ by the following rules: s_i[1]isi​[1]i;The length of s_isi​ is nn, and for each j \in [2, n]j∈[2,n], s_…

一步步编写操作系统 28 cpu乱序执行

乱序执行(乱序执行译作异步执行更贴切)&#xff0c;是指在cpu中运行的指令并不按照代码中的顺序执行&#xff0c;而是按照一定的策略打乱顺序执行&#xff0c;也许后面的指令先执行&#xff0c;当然&#xff0c;得保证指令之间不具备相关性。 举个简单的例子&#xff0c;比如如…

【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

题干&#xff1a; Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist(u,v)The min distance between node u and v. Give an integer k,for every pair (u,v) of vertices is called valid if and only if dist(u,v) not e…

Apollo进阶课程㉚丨Apollo ROS背景介绍

原文链接&#xff1a;进阶课程㉚丨Apollo ROS背景介绍 ROS是机器人学习和无人车学习最好Linux平台软件&#xff0c;资源丰厚。无人车的规划、控制算法通常运行在Linux系统上&#xff0c;各个模块通常使用ROS进行连接。 上周阿波君为大家详细介绍了「进阶课程㉙Apollo控制技术详…

一步步编写操作系统 29 cpu缓存简介

缓存是20世纪最大的发明&#xff0c;其原理用一些存取速度较快的存储设备做为数据缓冲区&#xff0c;避免频繁访问速度较慢的低速存储设备&#xff0c;归根结底的原因是&#xff0c;低速存储设备是整个系统的瓶颈&#xff0c;缓存用来缓解“瓶颈设备”的压力。 之前介绍实模式…

【CodeForces - 1096D】Easy Problem(dp,思维)

题目大意&#xff1a; 现在有一个由小写字母组成的字符串&#xff0c;去掉这个字符串的第i个位置的字符会有ai的代价。你的任务是去掉这个字符串中的一些字符使得该字符串中不包含子序列hard&#xff0c;且去掉字符的代价之和尽可能小。 输入 第一行一个整数n表示字符串的长…

一步步编写操作系统 30 cpu的分支预测简介

人在道路的分岔口时要预测哪条路能够到达目的地&#xff0c;面对众多选择时&#xff0c;计算机也一样要抉择&#xff0c;毕竟计算机的运行方式是以人的思路来设计的&#xff0c;计算机中的抉择其实就是人在抉择。 cpu中的指令是在流水线上执行。分支预测&#xff0c;是指当处理…

【HDU - 5492】Find a path(dp,tricks)

题干&#xff1a; Frog fell into a maze. This maze is a rectangle containing NN rows and MM columns. Each grid in this maze contains a number, which is called the magic value. Frog now stays at grid (1, 1), and he wants to go to grid (N, M). For each step,…

Apollo进阶课程㉜丨Apollo ROS原理—1

原文链接&#xff1a;进阶课程㉜丨Apollo ROS原理—1 ROS在开发过程中&#xff0c;基于功能把整个自动驾驶系统分成多个模块&#xff0c;每个模块负责自己消息的接收、处理、发布。当模块需要联调时&#xff0c;通过框架可以把各个模块快速的集成到一起。 上周阿波君为大家详细…

Ubuntu下安装Chrome浏览器的两个方法

一、通过直接下载安装Google Chrome浏览器deb包。 打开Ubuntu终端&#xff0c;以下为32位版本&#xff0c;使用下面的命令。 wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb 以下为64位版本&#xff0c;使用下面的命令。 wget https://dl.…

【EOlymp - 2908】SumThem All(数位统计,tricks)

题干&#xff1a; Find the sum of all the digits in all the integers between lowerBound and upperBound inclusive. Input Each line contains two integers lowerBound and upperBound (0 ≤ lowerBound ≤ upperBound ≤ 2109). Output For each test case print i…

Apollo进阶课程㉝丨Apollo ROS原理—2

原文链接&#xff1a;进阶课程㉝丨Apollo ROS原理—2 在ROS系统中&#xff0c;从数据的发布到订阅节点之间需要进行数据的拷贝。在数据量很大的情况下&#xff0c;很显然这会影响数据的传输效率。所以Apollo项目对于ROS第一个改造就是通过共享内存来减少数据拷贝&#xff0c;以…

Java 10 常用集合继承关系图

概述 集合类存放的都是对象的引用&#xff0c;而非对象本身&#xff0c;出于表达上的便利&#xff0c;我们称集合中的对象就是指集合中对象的引用。 类图如下&#xff1a; 1、Iterable与Iterator接口之间的区别 我看到好多网上的文章类图里面Collection 是继承Iterator接口&a…

【CodeForces - 673D】Bear and Two Paths(构造,tricks)

题干&#xff1a; Bearland has n cities, numbered 1 through n. Cities are connected via bidirectional roads. Each road connects two distinct cities. No two roads connect the same pair of cities. Bear Limak was once in a city a and he wanted to go to a cit…

Apoll进阶课程㉞丨Apollo ROS原理—3

原文链接&#xff1a;进阶课程㉞丨Apollo ROS原理—3 机器人操作系统(ROS)是一个成熟而灵活的机器人编程框架。ROS提供了所需的工具&#xff0c;可以轻松访问传感器数据&#xff0c;处理数据&#xff0c;并为机器人的电机和其它执行器生成适当的响应。整个ROS系统被设计为在计…

JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别

ava虽然是自动回收内存&#xff0c;但是应用程序&#xff0c;尤其服务器程序最好根据业务情况指明内存分配限制。否则可能导致应用程序宕掉。 举例说明含义&#xff1a; -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB&#xff0c;初始分配 -Xmx512m 表示JVM Heap(堆内存)最大允许…

SM3密码杂凑算法原理

目录 1.概述 2、算法描述 2.1 概述 2.2 填充 2.3 迭代压缩 2.3 消息扩展 2.4 压缩函数 2.5 杂凑值 1.概述 SM3是我国采用的一种密码散列函数标准&#xff0c;由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。 在商用密码体…

【Comet OJ - Contest #5 - C】迫真小游戏(优先队列,贪心构造,树,字典序)

题干&#xff1a; H君喜欢在阳台晒太阳&#xff0c;闲暇之余他会玩一些塔防小游戏。 H君玩的小游戏可以抽象成一棵 nn 个节点的有根树&#xff0c;树以 11 为根&#xff0c;每个点的深度定义为其到根的简单路径上的点数&#xff08;根的深度为 11&#xff09;。 H君有 nn 个…

动手学无人驾驶(1):交通标志识别

今天主要介绍无人驾驶当中深度学习技术的应用。 本文是根据博客专家AdamShan的文章整理而来&#xff0c;在此表示感谢。 关于深度学习的图像分类技术&#xff0c;网上已有很多关于深度学习的课程&#xff08;如吴恩达老师的深度学习专项课程&#xff09;&#xff0c;故本文不对…