题目描述 Description

在幻想乡,藤原妹红是拥有不老不死能力的人类。虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民。由于算得上是幻想乡最强的人类,对于她而言,迷途竹林的单向道路亦可以逆行。在妹红眼中,迷途竹林可以视为一个由N个路口(编号1..N),M条不同长度双向路连接的区域。妹红所在的红之自警队为了方便在迷途竹林中行动,绘制了一张特殊的迷途竹林地图,这张地图上只保留了N-1条道路,这些道路保证了任意两个路口间有且仅有一条路径,并且满足所有保留的道路长度之和最小,我们称这些道路为『自警队道路』。现在妹红打算在其中一个连接有多条『自警队道路』的路口设立根据地,当去掉根据地这个根据地所在路口后,就会出现某些路口间无法通过『自警队道路』相互连通的情况,我们认为这时仍然能够通过『自警队道路』连通的路口属于同一个『区域』。妹红希望最后每个『区域』的『自警队道路』总长尽可能平均,请计算出她应该选择哪一个路口作为根据地。
  下例中红色的路口为妹红选择的根据地,实线边表示『自警队道路』,绿色虚线边表示非『自警队道路』,数字表示边权,『自警队道路』中相同颜色的实线边代表属于同一个『区域』:
  
  (尽可能平均即权重最小,设每一块『区域』的路线总长为Length[i],平均路线长度为Avg=SUM{Length[i]}/区域数,权重d=∑( (Length[i]-Avg)^2 ) )

输入描述 Input Description

第1行:2个正整数N,M
  第2..M+1行:每行2个整数u,v和1个实数len,表示u,v之间存在长度为len的边

输出描述 Output Description

第1行:1个整数,最后选择的路口编号,存在多个可选路口时选择编号小的

样例输入 Sample Input

3 3
3 1 5
3 2 4
1 2 3

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

对于60%的数据:3 ≤ N ≤ 2,000,N-1 ≤ M ≤ 50,000
  对于100%的数据:3 ≤ N ≤ 40,000,N-1 ≤ M ≤ 200,000
  对于100%的数据:0 < len ≤ 100,000,000
 提示
  样例解释:
  妹红的『自警队道路』为(1,2)和(2,3)。
  只能选择2作为根据地,产生的两个区域Length[i]分别为3和4。
  所以方差为:(4-3.5)^2 + (3-3.5)^2 = 0.5

  注意:
  保证不存在相同距离的线路,两个路口间可能出现多条路径,且任意点对间至少存在一条路径。


本来想是树上最长链的中点,即树的中心…但其实并不是这样,因为要求方差最小,而断开某个点所分成的份数是不一样的,并且树的中心也不一定只有一个,所以就可以排除。

这样就可以树形DP了,思想很简单,按公式来就好。

务必注意是double类型!!!

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;const int SZ = 3000010;
const double INF = 1e30;int n,m;int head[SZ],nxt[SZ],tot = 0,ans,num[SZ];struct edge{int t;double d;
}l[SZ];void build(int f,int t,double d)
{l[++ tot].t = t;l[tot].d = d;nxt[tot] = head[f];head[f] = tot;
}double dist[SZ],sum = 0;double maxd = INF;double dfs(int u,int fa)
{double avg = sum/(double)num[u];double d = 0,son = 0;for(int i = head[u];i;i = nxt[i]){int v = l[i].t;if(v == fa) continue;dist[v] = l[i].d + dfs(v,u);d += (dist[v] - avg) * (dist[v] - avg);son += dist[v];}d += (sum - son - avg) * (sum - son - avg);
//  cout<<u<<" "<<avg<<" "<<d<<" "<<son<<endl;if(num[u] != 1)if(d < maxd || (d == maxd && ans > u)) ans = u,maxd = d;return son;
}struct haha{int f,t;double d;
}e[SZ];int fa[SZ];int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }bool cmp(haha a,haha b) { return a.d < b.d; }int main()
{scanf("%d%d",&n,&m);for(int i = 1;i <= n;i ++) fa[i] = i;for(int i = 1;i <= m;i ++){scanf("%d%d%lf",&e[i].f,&e[i].t,&e[i].d);}sort(e + 1,e + 1 + m,cmp);for(int i = 1;i <= m;i ++){int x = find(e[i].f);int y = find(e[i].t);if(x != y) {fa[x] = y;build(e[i].f,e[i].t,e[i].d);    build(e[i].t,e[i].f,e[i].d);num[e[i].f] ++;     num[e[i].t] ++;sum += e[i].d;}}dfs(1,0);printf("%d",ans);return 0;
}

【codevs1419】藤原妹红 树形DP相关推荐

  1. BSOJ2923 CODEVS1419 藤原妹红 最小生成树+树形dp

    2923 -- [模拟试题]藤原妹红 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民.由于妹红算得上是幻想乡最强的人类,对于她 ...

  2. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  3. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  4. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  5. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  6. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  7. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  8. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  9. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

最新文章

  1. ffmpeg图片压缩为视频
  2. wxWidgets:获取主机的IP地址
  3. 查找xml文件中某接点的值
  4. C和C++中static的用法及友元
  5. shell命令tree
  6. 三、Python-列表
  7. 实现线程安全的单例模式的四种方式
  8. EL4.1配置文件管理浅谈(1)
  9. ZOJ 2760 How Many Shortest Path 最大流+floyd求最短路
  10. AngularJs依赖注入的研究
  11. leetcode动态规划
  12. dubbo是长连接还是短连接_游戏宅的亲身体验,手柄还是物理连接好:雷蛇骑仕游戏手柄体验...
  13. Arduino 利用PWM对板载LED实现呼吸灯效果
  14. 最新搜狗收录提交工具分享
  15. 【转】我那实现了自己理想的创业老公,却一毛钱股份都没有拿到
  16. 使用 this.$parent 子组件调用父组件方法
  17. 失败者的人性弱点,来看看你中了几点
  18. d^3CTF web部分wp
  19. 十一招解决:系统IE部分网页打不开怎么办(转载)
  20. 助攻歌神演唱会喜提“第八杀”,AI应用创新浪潮来啦?

热门文章

  1. verilog实现5分频
  2. linux_linux自动化换源等优化美化自动化操作脚本/oh my zsh安装/卸载与删除/vim/vi卸载与更新异常/linux发行版本/内核版本查看
  3. 关于APP抓包,Mac就不配拥有姓名吗?
  4. 语义版本号(Semantic Versioning)
  5. 8-2 sdust-Java-文件读取与统计【人工判编程题】 (30 分)
  6. 【历史上的今天】7 月 25 日:IBM 获得了第一项专利;Verizon 收购雅虎;亚马逊发布 Fire Phone
  7. 实验三:CART分类决策树python实现(两个测试集)(一)|机器学习
  8. 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法
  9. 信息孤岛影响_解读制造业信息化转型的11大关键点!
  10. Linux安装rar压缩软件