2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)


我是傻逼我是傻逼
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+50;
typedef long long ll;
const ll mod=998244353;
int Laxt[maxn],Next[maxn],To[maxn],cnt;
void add(int u,int v){
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
Next[++cnt]=Laxt[v];
Laxt[v]=cnt;
To[cnt]=u;
}
ll dp[maxn],sz[maxn];
int vis[maxn];
void dfs(int u,int p){
sz[u]=1;vis[u]=1;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v==p)continue;
dfs(v,u);
sz[u]+=sz[v];
dp[u]+=dp[v]+sz[v];
}
}
ll mi[5],id[5];
void dfs1(int u,int pre,int o){
if(mi[o]>dp[u]){
mi[o]=dp[u];id[o]=u;
}
// cout<<"u="<<u<<" "<<"dp[u]="<<dp[u]<<endl;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v==pre)continue;
dp[u]-=dp[v]+sz[v];
sz[u]-=sz[v];
dp[v]+=dp[u]+sz[u];
sz[v]+=sz[u];
dfs1(v,u,o);
sz[v]-=sz[u];
dp[v]-=dp[u]+sz[u];
sz[u]+=sz[v];
dp[u]+=dp[v]+sz[v];
}
}
ll sum=0;
void dfs2(int u,int pre){
sum+=dp[u];
// cout<<"u="<<u<<" "<<dp[u]<<endl;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(v==pre)continue;
dp[u]-=dp[v]+sz[v];
sz[u]-=sz[v];
dp[v]+=dp[u]+sz[u];
sz[v]+=sz[u];
dfs2(v,u);
sz[v]-=sz[u];
dp[v]-=dp[u]+sz[u];
sz[u]+=sz[v];
dp[u]+=dp[v]+sz[v];
}
}
int main(){
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1;i<=n-2;i++){
int u,v;
cin>>u>>v;
add(u,v);
}
int tot=0;
for(int i=0;i<4;i++)mi[i]=1e18;
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i,0);
/* for(int i=1;i<=n;i++){
cout<<"i="<<i<<" "<<dp[i]<<" "<<sz[i]<<endl;
}*/
dfs1(i,0,++tot);
}
}
add(id[1],id[2]);
memset(dp,0,sizeof(dp));
memset(sz,0,sizeof(sz));
dfs(1,0);
dfs2(1,0);
cout<<sum/2<<endl;
return 0;
}
2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)的更多相关文章
- hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解
题意:有一棵n个点的树,点之间用无向边相连.现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其 ...
- HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 浅谈关于树形dp求树的直径问题
在一个有n个节点,n-1条无向边的无向图中,求图中最远两个节点的距离,那么将这个图看做一棵无根树,要求的即是树的直径. 求树的直径主要有两种方法:树形dp和两次bfs/dfs,因为我太菜了不会写后者这 ...
- 树形dp - 求树的直径
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...
- 2017 Wuhan University Programming Contest (Online Round) B Color 树形dp求染色方法数
/** 题目:Color 链接:https://oj.ejq.me/problem/23 题意:给定一颗树,将树上的点最多染成m种颜色,有些节点不可以染成某些颜色.相邻节点颜色不同.求染色方法数. 思 ...
- HDU - 3899 JLUCPC(树形dp求距离和)
JLUCPC Dr. Skywind and Dr. Walkoncloud are planning to hold the annual JLU Collegiate Programming Co ...
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...
- 树形DP求树的重心 --SGU 134
令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...
- CSP模拟赛 Repulsed(树形DP)
题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...
随机推荐
- Luogu P5652 基础博弈练习题 (博弈论、图论)
题目链接 https://www.luogu.org/problem/P5652 题解 好题,想了四小时-- 首先考虑如何判断胜负: 首先假设只有一个柱子,那就是奇败偶胜.不难发现最后一个奇数后面的偶 ...
- JavaWeb_(Struts2框架)使用Servlet实现用户的登陆
JavaWeb_(Struts2框架)使用Struts框架实现用户的登陆 传送门 JavaWeb_(Struts2框架)Servlet与Struts区别 传送门 MySQL数据库中存在Gary用户,密 ...
- Java基础__ToString()方法
Java toString() 方法 (一).方便println()方法的输出 public class TString { private String name; public TString(S ...
- 在.slurm文件中激活Anaconda环境
超算中心使用slurm作为集群调度.原始slurm脚本如下: source activate tensorflow-gpu python neural_style.py --content conte ...
- 【Blog怎么玩】什么叫EntryName友好地址名?
EntryName友好地址名 其实就是你这个页面的别名,如果设置的好的话,在SEO搜索中,会更清晰的显示出来. 好处1:清晰的URL 比如我有一篇展示可爱兔子的博文,我想让它的网址清晰的显示出来,而不 ...
- R语言:时间的转化
一般使用R从数据库导出来的时间数据一般都不是我们能看的懂的(具体是什么格式的我也忘记了),需要做如下转化 as.Date(time,origin = '1970-01-01') 最近从网上爬下来的时间 ...
- OSI的七层模型和TCP/IP的五层模型
OSI七层模型: 应用层->表示层->会话层->传输层->网络层->数据链路层->物理层 TCP/IP五层模型: 应用层->传输层->网络层->数 ...
- Hibernate系列1:入门程序
1.传统的java数据库连接 在传统的开发中,如果要建立java程序和数据库的连接,通常采用JDBC或者Apache Commons DbUtils开发包来完成.他们分别有以下特点: JDBC: 优点 ...
- python 装饰器 (test = submit(test))
两层的装饰器,这里对于register不需要进行输入 usename, passwd = 'alex', 'abc123' def register(func): def wrapper(*args, ...
- html添加注释怎么弄?
HTML 注释: <!--这是一段注释.注释不会在浏览器中显示.--> 这是一段普通的段落. 快捷键: 我用的是 Notpad++ 添加行注释 Ctrl+K 取消行注释 Ctrl+Shif ...