博客
关于我
hdu6567 Cotree (树形dp 树的重心)
阅读量:249 次
发布时间:2019-03-01

本文共 1711 字,大约阅读时间需要 5 分钟。

Problem Description

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)
, 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

思路:

树中所有点到某个点的距离和中,到重心的距离和是最小的;

如果有两个重心,那么他们的距离和一样

两次dfs树形dp找到两颗树的重心

把两个重心连接起来
再dfs树形dp一次计算答案

计算树上任意两点的距离和,转化为计算每条边被经过的次数乘上边权

每条边被经过的次数等于这条边分隔开
两端点分别所在的连通块的大小相乘
最后一次dfs树形dp的过程中
假设u是v的父节点,
以v为根的子树大小为sz[v]
则连接他们的边被经过的次数为(n-sz[v])*sz[v]

code:

#include
#include
#include
#include
#include
#include
#include
using namespace std;#define ll long longconst int inf=1e9;const int maxm=1e5+5;int head[maxm],nt[maxm<<1],to[maxm<<1],cnt;int mark[maxm];int sz[maxm],son[maxm];int num;//第一个连通块的大小int size;//第二个连通块的大小int root1,root2;int n;ll ans;void init(){ memset(head,0,sizeof head); memset(mark,0,sizeof mark); cnt=1; num=0; ans=0;}void add(int x,int y){ cnt++;nt[cnt]=head[x];head[x]=cnt;to[cnt]=y;}void dfs(int x){ num++;//计算连通块大小 sz[x]=1; son[x]=0; mark[x]=1; for(int i=head[x];i;i=nt[i]){ int v=to[i]; if(mark[v])continue; dfs(v); sz[x]+=sz[v]; son[x]=max(son[x],sz[v]); }}void dfs2(int x){ sz[x]=1; son[x]=0; mark[x]=1; for(int i=head[x];i;i=nt[i]){ int v=to[i]; if(mark[v])continue; dfs2(v); sz[x]+=sz[v]; son[x]=max(son[x],sz[v]); } son[x]=max(son[x],size-sz[x]); if(son[x]

转载地址:http://bnzv.baihongyu.com/

你可能感兴趣的文章
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>
Mysql: 对换(替换)两条记录的同一个字段值
查看>>
mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
查看>>