HDU 5723 Abandoned country 最小生成树+搜索
Abandoned country
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 4477 Accepted Submission(s): 1124
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.
4 6
1 2 1
2 3 2
3 4 3
4 1 4
1 3 5
2 4 6
/*
HDU 5723 Abandoned country 最小生成树+搜索 problem:
给你n个点和m条边,让你求最少花费多少可以将所有点连通并求出任意两点的花费期望 solve:
第一个直接求最小生成树。主要是不懂它这个期望到底要求什么。看题解说的是深搜求出每条路用过
的次数来得到总花费。然后除以可能发生的次数 by——hhh
*/
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <map>
#define lson ch[r][0]
#define rson ch[r][1]
#define ll long long
#define key_val ch[ch[root][1]][0]
using namespace std;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
int vis[maxn];
int f[maxn];
vector<pair<int,int>> q[maxn];
struct Edge
{
int u,v,w;
} edge[1000010]; int tot; void add(int u,int v,int val)
{
edge[tot].u = u,edge[tot].v = v,edge[tot++].w = val;
} bool cmp(Edge a,Edge b)
{
return a.w < b.w;
} int fin(int x)
{
if(f[x] == -1) return x;
return f[x] = fin(f[x]);
} ll cal(int n)
{
memset(f,-1,sizeof(f));
sort(edge,edge+tot,cmp);
ll cnt = 0,ans = 0;
for(int i = 0; i < tot; i++)
{
int u = edge[i].u;
int v = edge[i].v;
int w = edge[i].w;
int t1 = fin(u),t2 = fin(v);
if(t1 != t2)
{
ans = (ll)(ans + w);
f[t1] = t2;
cnt++;
q[u].push_back(make_pair(v,w));
q[v].push_back(make_pair(u,w)); }
if(cnt == n-1)
break;
}
// cout << cnt <<endl;
return ans;
}
int n;
double ans;
ll dfs(int now)
{
vis[now] = 1;
ll t = 0,ta = 0;
for(int i = 0; i < q[now].size(); i++)
{
ll v = q[now][i].first;
ll w = q[now][i].second;
if(!vis[v])
{
t = dfs(v);
ta += t;
ans = ans+1.0*t*(n-t)*w;
}
}
return ta+1;
} int main()
{
int T,a,c,b;
// freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
int m;
ll tans;
tot = 0,ans = 0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m); for(int i =0; i <= n; i++)
q[i].clear();
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
if(!n || !m)
{
printf("0 0.00\n");
continue;
}
tans = cal(n);
dfs(1);
double t = (1.0*n*(n-1)/2);
// cout <<ans <<" " <<t<<endl;
printf("%I64d %.2f\n",tans,ans/t);
}
return 0;
}
HDU 5723 Abandoned country 最小生成树+搜索的更多相关文章
- hdu 5723 Abandoned country 最小生成树 期望
Abandoned country 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...
- hdu 5723 Abandoned country 最小生成树+子节点统计
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 5723 Abandoned country (最小生成树+dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5723 n个村庄m条双向路,从中要选一些路重建使得村庄直接或间接相连且花费最少,这个问题就是很明显的求最 ...
- 最小生成树 kruskal hdu 5723 Abandoned country
题目链接:hdu 5723 Abandoned country 题目大意:N个点,M条边:先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望 /************** ...
- HDU 5723 Abandoned country(落后渣国)
HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 ...
- HDU 5723 Abandoned country 【最小生成树&&树上两点期望】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5723 Abandoned country Time Limit: 8000/4000 MS (Java/ ...
- HDU 5723 Abandoned country (最小生成树 + dfs)
Abandoned country 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...
- hdu 5723 Abandoned country(2016多校第一场) (最小生成树+期望)
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 5723 Abandoned country(kruskal+dp树上任意两点距离和)
Problem DescriptionAn abandoned country has n(n≤100000) villages which are numbered from 1 to n. Sin ...
随机推荐
- C语言--第四周作业
一.题目7-1 计算分段函数[1] 1.代码 #include <stdio.h> int main () { float x,result; scanf("%f",& ...
- 库函数strstr的实现
没什么说的,常规思路: 函数原型:const char* StrStr(const char *str1, const char *str2) 方法一: str1:源字符串: str2:需要查找的目的 ...
- Lucene 的索引文件锁原理
Lucene 的索引文件锁原理 2016/11/24 · IT技术 · lucene 环境 Lucene 6.0.0Java “1.8.0_111”OS Windows 7 Ultimate 线程 ...
- 不允许用(a+b)/2这种方式求两个数的均值;如下程序在Linux和32位集成开发环境中运行
#define MAX(a,b) ((a)>(b)?(a):(b)) #include<stdio.h> int main() { int a = 10; int b = 20; i ...
- hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(3)http://www.cnblogs.com/liugh/p/6624491.html
一.文件准备 scala-2.12.1.tgz 下载地址: http://www.scala-lang.org/download/2.12.1.html 二.工具准备 2.1 Xshell 2.2 X ...
- 【iOS】 含tableView的ViewController基类的实现
上篇博客写了ViewController的基类的实现,这篇博客主要写在BaseViewController的基础上实现一个含tableView控件的基类的实现,主要给包含tableView的页面来继承 ...
- windows10无法启动承载网络
每个都试一下
- 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
- TreeMap就这么简单【源码剖析】
前言 声明,本文用得是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单[源码剖析] Map集合.散列表.红黑树介绍 HashMap就是这么简单[源码剖析] LinkedH ...
- Spring MVC的核心流程(步骤)
具体步骤: 1.客户端发送请求先要经过前端控制器,请求被Spring 前端控制器DispatcherServlet获取,如详细图第一步:DispatcherServlet对请求URL进行解析(比如我们 ...