传送门

Average distance

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 682    Accepted Submission(s): 244
Special Judge

Problem Description
Given a tree, calculate the average distance between two vertices in the tree. For example, the average distance between two vertices in the following tree is (d01 + d02 + d03 + d04 + d12 +d13 +d14 +d23 +d24 +d34)/10 = (6+3+7+9+9+13+15+10+12+2)/10 = 8.6.

 
Input
On the first line an integer t (1 <= t <= 100): the number of test cases. Then for each test case:

One line with an integer n (2 <= n <= 10 000): the number of nodes in the tree. The nodes are numbered from 0 to n - 1.

n - 1 lines, each with three integers a (0 <= a < n), b (0 <= b < n) and d (1 <= d <= 1 000). There is an edge between the nodes with numbers a and b of length d. The resulting graph will be a tree.

 
Output
For each testcase:

One line with the average distance between two vertices. This value should have either an absolute or a relative error of at most 10-6

 
Sample Input
1
5
0 1 6
0 2 3
0 3 7
3 4 2
 
Sample Output
8.6
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  2378 2379 2377 2380 2381 
 
 

哎,思路想复杂了,其实蛮简单的:

转一发题解:

引:如果暴力枚举两点再求距离是显然会超时的。转换一下思路,我们可以对每条边,求所有可能的路径经过此边的次数:设这条边两端的点数分别为A和B,那 么这条边被经过的次数就是A*B,它对总的距离和的贡献就是(A*B*此边长度)。我们把所有边的贡献求总和,再除以总路径数N*(N-1)/2,即为最 后所求。

每条边两端的点数的计算,实际上是可以用一次dfs解决的。任取一点为根,在dfs的过程中,对每个点k记录其子树包含的点数(包括其自身),设点数为a[k],则k的父亲一侧的点数即为N-a[k]。这个统计可以和遍历同时进行。故时间复杂度为O(n)。

16447376 2016-03-06 09:40:59 Accepted 2376 312MS 4540K 2093 B C++ czy
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <stack>
  6. #include <cctype>
  7. #include <vector>
  8. #include <cmath>
  9. #include <map>
  10. #include <queue>
  11.  
  12. #define ll long long
  13. #define N 10005
  14. #define eps 1e-8
  15.  
  16. using namespace std;
  17.  
  18. int T;
  19. double tot[N];
  20. double cou[N];
  21. double num;
  22. int n;
  23.  
  24. struct PP
  25. {
  26. int to;
  27. double val;
  28. };
  29.  
  30. vector<PP>Edge[N];
  31.  
  32. PP te;
  33.  
  34. void add_adge(int from,int to,double val)
  35. {
  36. te.to = to;te.val = val;
  37. Edge[from].push_back(te);
  38. te.to = from;te.val = val;
  39. Edge[to].push_back(te);
  40. }
  41.  
  42. void dfs(int now,int fa)
  43. {
  44. unsigned int i;
  45. PP nt;
  46. cou[now] = ;
  47. for(i = ;i < Edge[now].size();i++){
  48. nt.to = Edge[now][i].to;
  49. nt.val = Edge[now][i].val;
  50. if(nt.to == fa){
  51. continue;
  52. }
  53. dfs(nt.to,now);
  54. tot[now] = tot[now] + tot[nt.to] + (n-cou[nt.to]) * cou[nt.to] * nt.val;
  55. cou[now] = cou[now] + cou[nt.to];
  56. //printf(" now = %d i=%d to=%d tot=%.6f cou=%.6lf\n",now,i,nt.to,tot[now],cou[now]);
  57. }
  58. //printf(" i=%d tot=%.6f cou=%.6f\n",now,tot[now],cou[now]);
  59. }
  60.  
  61. int main()
  62. {
  63. //freopen("in.txt","r",stdin);
  64. scanf("%d",&T);
  65. int i;
  66. int from,to;
  67. double val;
  68. for(int ccnt=;ccnt<=T;ccnt++){
  69. //while(scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3])!=EOF){
  70. scanf("%d",&n);
  71. memset(tot,,sizeof(tot));
  72. memset(cou,,sizeof(cou));
  73. num = 1.0 *n*(n-)/;
  74. for(i=;i<=n;i++){
  75. Edge[i].clear();
  76. }
  77. for(i=;i<=n-;i++){
  78. scanf("%d%d%lf",&from,&to,&val);
  79. add_adge(from,to,val);
  80. }
  81. dfs(,-);
  82. //for(i=0;i<n;i++){
  83. // for(int j=0;j<Edge[i].size();j++){
  84. // printf(" i=%d to=%d val=%.6lf\n",i,Edge[i][j].to,Edge[i][j].val);
  85. // }
  86. // }
  87. for(i=;i<n;i++){
  88. //printf(" i=%d tot=%.6f cou=%.6f\n",i,tot[i],cou[i]);
  89. }
  90. printf("%lf\n",tot[]/num);
  91. }
  92. return ;
  93. }

hdu 2736 Average distance的更多相关文章

  1. 【hdu 2376】Average distance

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=2376 [题意] 让你计算树上任意两点之间的距离的和. [题解] 算出每条边的两端有多少个节点设为n ...

  2. hdu 4712 Hamming Distance(随机函数暴力)

    http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...

  3. hdu 4712 Hamming Distance 随机

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  4. HDU 4712 Hamming Distance(随机算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 题目大意:任意两个数按位异或后二进制中含1的个数被称为海明距离,给定n个数,求出任意其中两个最小 ...

  5. hdu 4712 Hamming Distance ( 随机算法混过了 )

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  6. HDU 472 Hamming Distance (随机数)

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) To ...

  7. HDU 4712 Hamming Distance(随机算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 解题报告:输入n个数,用十六进制的方式输入的,任意选择其中的两个数进行异或,求异或后的数用二进制 ...

  8. HDU 4217 Hamming Distance 随机化水过去

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  9. HDU ACM 2895-Edit distance

    Edit distance Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total ...

随机推荐

  1. CF781A Andryusha and Colored Balloons

    题意: Andryusha goes through a park each day. The squares and paths between them look boring to Andryu ...

  2. PMP项目管理学习笔记(8)——整个管理之监控项目工作、综合变更控制、结束项目或阶段

    监控项目工作 输入:企业环境要素.组织过程资产.项目管理计划.绩效报告 工具:专家判断 输出:变更请求.项目管理计划更新.项目文档更新 综合变更控制 输入:企业环境要素.组织过程资产.项目管理计划.变 ...

  3. 华为S3700交换机DHCP 配置

    1.设置交换机名称 system-view [Huawei]sysname dhcp01 [dhcp01] 2.配置管理IP [dhcp01]interface Vlanif 1 [dhcp01-Vl ...

  4. centos7 搭建双网卡bond1(主备模式)实例

    前景须知: 在redhat6 中网卡叫bond,在redhat7及centos7中改名team,此处只记录centos7中双网卡主备搭建过程. 应用情景:实现网络的高可用,防止一条网线或交换机故障影响 ...

  5. app支付宝授权登录获取用户信息

    由后台进行地址的拼接(前台进行授权) // 生成授权的参数 String sign = ""; Long userId1 = SecurityUser.getUserId(); S ...

  6. yii 和 zend studio 集成

    yii是基于测试驱动的,而zend studio是一个好用的ide.集成就是必须的. 本文适合喜欢使用ide的开发者,vim用户或者文本编辑器使用者请忽略. 本文使用的是最新的zend studio ...

  7. python day two

    今日内容: 1.常用数据类型及内置方法 2.文件处理 3.函数 列表类型: 定义: 在[]内,可以存放多个任意类型的值,并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... 优先掌握的操作: ...

  8. 安卓adb在拨号键盘上输入井号(#)

    安卓系统下由于#号是属于内定字符,需要转义为%23第一种方式:adb shell service call phone 1 s16 "%23"第二种方式:adb shell am ...

  9. Archive for required library: 'D:/Program Files/Apache/maven-repository/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar'

    今天导入一个项目工程,发现报错:Archive for required library: 'D:/Program Files/Apache/maven-repository/dom4j/dom4j/ ...

  10. 第1节 flume:7、flume的监控文件夹,实现数据收集到hdfs上

    1.2.2 采集案例 1.采集目录到HDFS 需求分析 结构示意图: 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大 ...