hdu 2736 Average distance
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
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.
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
5
0 1 6
0 2 3
0 3 7
3 4 2
哎,思路想复杂了,其实蛮简单的:
引:如果暴力枚举两点再求距离是显然会超时的。转换一下思路,我们可以对每条边,求所有可能的路径经过此边的次数:设这条边两端的点数分别为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 |
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #include <stack>
- #include <cctype>
- #include <vector>
- #include <cmath>
- #include <map>
- #include <queue>
- #define ll long long
- #define N 10005
- #define eps 1e-8
- using namespace std;
- int T;
- double tot[N];
- double cou[N];
- double num;
- int n;
- struct PP
- {
- int to;
- double val;
- };
- vector<PP>Edge[N];
- PP te;
- void add_adge(int from,int to,double val)
- {
- te.to = to;te.val = val;
- Edge[from].push_back(te);
- te.to = from;te.val = val;
- Edge[to].push_back(te);
- }
- void dfs(int now,int fa)
- {
- unsigned int i;
- PP nt;
- cou[now] = ;
- for(i = ;i < Edge[now].size();i++){
- nt.to = Edge[now][i].to;
- nt.val = Edge[now][i].val;
- if(nt.to == fa){
- continue;
- }
- dfs(nt.to,now);
- tot[now] = tot[now] + tot[nt.to] + (n-cou[nt.to]) * cou[nt.to] * nt.val;
- cou[now] = cou[now] + cou[nt.to];
- //printf(" now = %d i=%d to=%d tot=%.6f cou=%.6lf\n",now,i,nt.to,tot[now],cou[now]);
- }
- //printf(" i=%d tot=%.6f cou=%.6f\n",now,tot[now],cou[now]);
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- scanf("%d",&T);
- int i;
- int from,to;
- double val;
- for(int ccnt=;ccnt<=T;ccnt++){
- //while(scanf("%lf%lf%lf%lf",&a[0],&a[1],&a[2],&a[3])!=EOF){
- scanf("%d",&n);
- memset(tot,,sizeof(tot));
- memset(cou,,sizeof(cou));
- num = 1.0 *n*(n-)/;
- for(i=;i<=n;i++){
- Edge[i].clear();
- }
- for(i=;i<=n-;i++){
- scanf("%d%d%lf",&from,&to,&val);
- add_adge(from,to,val);
- }
- dfs(,-);
- //for(i=0;i<n;i++){
- // for(int j=0;j<Edge[i].size();j++){
- // printf(" i=%d to=%d val=%.6lf\n",i,Edge[i][j].to,Edge[i][j].val);
- // }
- // }
- for(i=;i<n;i++){
- //printf(" i=%d tot=%.6f cou=%.6f\n",i,tot[i],cou[i]);
- }
- printf("%lf\n",tot[]/num);
- }
- return ;
- }
hdu 2736 Average distance的更多相关文章
- 【hdu 2376】Average distance
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=2376 [题意] 让你计算树上任意两点之间的距离的和. [题解] 算出每条边的两端有多少个节点设为n ...
- hdu 4712 Hamming Distance(随机函数暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...
- hdu 4712 Hamming Distance 随机
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU 4712 Hamming Distance(随机算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 题目大意:任意两个数按位异或后二进制中含1的个数被称为海明距离,给定n个数,求出任意其中两个最小 ...
- hdu 4712 Hamming Distance ( 随机算法混过了 )
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU 472 Hamming Distance (随机数)
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) To ...
- HDU 4712 Hamming Distance(随机算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 解题报告:输入n个数,用十六进制的方式输入的,任意选择其中的两个数进行异或,求异或后的数用二进制 ...
- HDU 4217 Hamming Distance 随机化水过去
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU ACM 2895-Edit distance
Edit distance Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
随机推荐
- CF781A Andryusha and Colored Balloons
题意: Andryusha goes through a park each day. The squares and paths between them look boring to Andryu ...
- PMP项目管理学习笔记(8)——整个管理之监控项目工作、综合变更控制、结束项目或阶段
监控项目工作 输入:企业环境要素.组织过程资产.项目管理计划.绩效报告 工具:专家判断 输出:变更请求.项目管理计划更新.项目文档更新 综合变更控制 输入:企业环境要素.组织过程资产.项目管理计划.变 ...
- 华为S3700交换机DHCP 配置
1.设置交换机名称 system-view [Huawei]sysname dhcp01 [dhcp01] 2.配置管理IP [dhcp01]interface Vlanif 1 [dhcp01-Vl ...
- centos7 搭建双网卡bond1(主备模式)实例
前景须知: 在redhat6 中网卡叫bond,在redhat7及centos7中改名team,此处只记录centos7中双网卡主备搭建过程. 应用情景:实现网络的高可用,防止一条网线或交换机故障影响 ...
- app支付宝授权登录获取用户信息
由后台进行地址的拼接(前台进行授权) // 生成授权的参数 String sign = ""; Long userId1 = SecurityUser.getUserId(); S ...
- yii 和 zend studio 集成
yii是基于测试驱动的,而zend studio是一个好用的ide.集成就是必须的. 本文适合喜欢使用ide的开发者,vim用户或者文本编辑器使用者请忽略. 本文使用的是最新的zend studio ...
- python day two
今日内容: 1.常用数据类型及内置方法 2.文件处理 3.函数 列表类型: 定义: 在[]内,可以存放多个任意类型的值,并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... 优先掌握的操作: ...
- 安卓adb在拨号键盘上输入井号(#)
安卓系统下由于#号是属于内定字符,需要转义为%23第一种方式:adb shell service call phone 1 s16 "%23"第二种方式:adb shell am ...
- 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/ ...
- 第1节 flume:7、flume的监控文件夹,实现数据收集到hdfs上
1.2.2 采集案例 1.采集目录到HDFS 需求分析 结构示意图: 采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大 ...