http://acm.hdu.edu.cn/showproblem.php?pid=5723

Abandoned country

Problem Description
 
An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guaranteed that any two wi are different. The roads made all the villages connected directly or indirectly before destroyed. Every road will cost the same value of its length to rebuild. The king wants to use the minimum cost to make all the villages connected with each other directly or indirectly. After the roads are re-built, the king asks a men as messenger. The king will select any two different points as starting point or the destination with the same probability. Now the king asks you to tell him the minimum cost and the minimum expectations length the messenger will walk.
 
Input
 
The first line contains an integer T(T≤10) which indicates the number of test cases. 
For each test case, the first line contains two integers n,m indicate the number of villages and the number of roads to be re-built. Next m lines, each line have three number i,j,wi, the length of a road connecting the village i and the village j is wi.
 
Output
 
output the minimum cost and minimum Expectations with two decimal places. They separated by a space.
 
Sample Input
 
1
4 6
1 2 1
2 3 2
3 4 3
4 1 4
1 3 5
2 4 6
 
Sample Output
 
6 3.33
 
题意:国家有M条废弃的路和N个点,现在要重新修,第一个问题是求出连通每一个点需要的最短路径是多少,第二个问题是求在连通的路任意选两个点走,它的最小期望是多少。
思路:第一个问题很简单,就是单纯的最小生成树,但是第二个问题一开始让我和队友感到很迷茫。英文题面,真是比较难懂意思。最小期望??什么鬼。。后来仔细想了好久,建立起了最小生成树的图了。。最终还是不会做,不知道DFS怎么跑来算期望。。听了别人的讲解才知道  一棵树上,设某一段路在用DFS遍历路径过程中在该条路径遍历过的次数为 cnt,例如有这样一条路径:1 -> 3 -> 5 -> 2 ,那么 路 1 -> 3 的cnt为3,路 3 -> 5 的cnt为2,路 5 -> 2 的cnt为1,这样。我们要算 路 1 -> 3 对答案的贡献,那么设 路 1 -> 3的权值为 w, 它的贡献就是 cnt * ( n - cnt ) * w , 然后期望就是 所有的路的贡献加起来 * 2 / ( n * ( n - 1 ) ) 。
这里用 Kruskal 算法比较好,复杂度低,也利于建最小生成树的图。
 
 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
#define N 100005
#define M 1000005
typedef pair <int, int> P;
struct node
{
int u, v, w;
}e[M*];
vector <P> edge[N]; int n, m;
double ans2;
int fa[N]; bool cmp(const node& e1, const node& e2)
{
return e1.w < e2.w;
} int Find(int x)
{
if(fa[x] == x) return x;
return fa[x] = Find(fa[x]);
} void Union(int x, int y)
{
int fx = Find(x), fy = Find(y);
if(fx != fy) fa[fx] = fy;
} long long Kruskal()
{
for(int i = ; i <= n; i++)
fa[i] = i;
for(int i = ; i <= n; i++)
edge[i].clear(); sort(e, e + m*, cmp);
long long res = ;
for(int i = ; i < m*; i++) {
int u = e[i].u, v = e[i].v, w = e[i].w;
int fu = Find( u ), fv = Find( v );
if(fu != fv) {
Union( u, v );
res += e[i].w;
edge[u].push_back(P(v, w));
edge[v].push_back(P(u, w));
//建最小生成树的图
}
}
return res;
} int dfs(int u, int fa)
{
int cnt = ;
for(int i = ; i < edge[u].size(); i++) {
int v = edge[u][i].first , w = edge[u][i].second;
if( fa != v ) {
int now = dfs(v, u);
cnt += now;
ans2 = ans2 + 1.0 * now * (n - now) * w;
//算每段路的贡献
}
}
return cnt + ;
} int main()
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
for(int i = ; i < m; i++) {
scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w);
e[m+i].v = e[i].u;
e[m+i].u = e[i].v;
e[m+i].w = e[i].w;
} long long ans1 = Kruskal();
ans2 = ;
dfs(, -);
ans2 = ans2 * 2.0 / (1.0 * n) / (n - 1.0); printf("%I64d %.2f\n", ans1, ans2);
}
return ;
}

HDU 5723:Abandoned country(最小生成树+算期望)的更多相关文章

  1. HDU 5723 Abandoned country 最小生成树+搜索

    Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  2. hdu 5723 Abandoned country 最小生成树 期望

    Abandoned country 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...

  3. hdu 5723 Abandoned country 最小生成树+子节点统计

    Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  4. HDU 5723 Abandoned country (最小生成树+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5723 n个村庄m条双向路,从中要选一些路重建使得村庄直接或间接相连且花费最少,这个问题就是很明显的求最 ...

  5. 最小生成树 kruskal hdu 5723 Abandoned country

    题目链接:hdu 5723 Abandoned country 题目大意:N个点,M条边:先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望 /************** ...

  6. HDU 5723 Abandoned country(落后渣国)

    HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 ...

  7. HDU 5723 Abandoned country 【最小生成树&&树上两点期望】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5723 Abandoned country Time Limit: 8000/4000 MS (Java/ ...

  8. hdu 5723 Abandoned country(2016多校第一场) (最小生成树+期望)

    Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. HDU 5723 Abandoned country (最小生成树 + dfs)

    Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...

  10. HDU 5723 Abandoned country(kruskal+dp树上任意两点距离和)

    Problem DescriptionAn abandoned country has n(n≤100000) villages which are numbered from 1 to n. Sin ...

随机推荐

  1. java_Mac安装多个JDK版本并设置环境变量

    JDK6.JDK7.JDK8三个版本的汇总地址:https://pan.baidu.com/s/1pKSYv8Z 安装 JDK6安装 JDK6下载地址 见网盘 安装完毕后确认版本 JavaForOSX ...

  2. WPF Dispatcher的使用

     <Window x:Class="DispatcherExam.MainWindow"         xmlns="http://schemas.micro ...

  3. Httpclient Fluent API简单封装

    import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List ...

  4. Win10《芒果TV》更新v3.8.30流星版:优化稳定性、升级无边框播放体验

    随着暑假到来,大波王牌综艺和青春电视剧热浪来袭,Win10版<芒果TV>全平台同步更新流星版v3.8.30,进一步提升稳定性,巩固播放体验,升级剧场模式和画中画无边框体验,我们在芒果等你. ...

  5. js通过沿着作用域链还是原型链查找变量

    这是一道非常典型的JS闭包问题,结果和具体的解析请看这里. 对于其中的`函数作用域链的问题`博主似乎没有解释清楚,有一些疑问:js中的变量到底是沿着作用域链还是原型链查找呢? 首先,要分清作用域链与原 ...

  6. 关于 Apache 2.4 配置PHP时的错误记录

    1. 访问虚拟配置的站点抛出 Forbidden 403 错误 解决办法: <Directory E:/Xingzhi/Php/xingzhi.xingzhi.com/>     Opti ...

  7. Quartz Cron 生成工具

    /** * 每周期 */ function everyTime(dom) { var item = $("input[name=v_" + dom.name + "]&q ...

  8. Devart Blog

    How to combine data from several sources using SQL and VirtualQueryhttp://blog.devart.com/how-to-com ...

  9. git(二)

    一.GitHub(代码的云仓库) 1.创建一个新的项目 git remote add origin https://github.com/1352282824shy/COCAP.git git pus ...

  10. git初学【常用命令、上传项目到码云或从码云拉取、克隆项目】

    1.下载git.https://git-scm.com/   注册码云:https://gitee.com/2.安装git:  默认安装即可:  安装完成之后打开git bash进行最后一步配置  输 ...