最小生成树 kruskal hdu 5723 Abandoned country
题目链接:hdu 5723 Abandoned country
题目大意:N个点,M条边;先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望
/**************************************************************
Problem:hdu 5723
User: youmi
Language: C++
Result: Accepted
Time:2932MS
Memory:22396K
solution:首先注意到任意两条边的边权是不一样的,由此得知最小生成树是唯一的,最小生成树既然是唯一的,
那么期望其实也就是唯一的,不存在什么最小期望。求完最小生成树之后,接下来的问题就可以转换成
在最小生成树上求任意两点之间距离的平均值,对于每条边,统计所 有的路径用到此边的次数,也就
是边的两端的点数之积。那么这条边的总贡献就是次数*边 权。最后得到所有边的贡献之和再除以总路
径数n*(n-1)/2n∗(n−1)/2就是答案。可以OnOn求出。任取一点为根dfs,对每个点ii记录其子树包
含的点数(包括其自身),设点数为sum[i]sum[i],则ii的父亲一侧的点数即为n-sum[i]n−sum[i]。
一边遍历一边统计就行。
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep(i,from,to) for(int i=from;i<=to;i++)
#define irep(i,to,from) for(int i=to;i>=from;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define eps 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl
const double pi=*atan(1.0); using namespace std;
typedef long long ll;
template <class T> inline void read(T &n)
{
char c; int flag = ;
for (c = getchar(); !(c >= '' && c <= '' || c == '-'); c = getchar()); if (c == '-') flag = -, n = ; else n = c - '';
for (c = getchar(); c >= '' && c <= ''; c = getchar()) n = n * + c - ''; n *= flag;
}
int Pow(int base, ll n, int mo)
{
if (n == ) return ;
if (n == ) return base % mo;
int tmp = Pow(base, n >> , mo);
tmp = (ll)tmp * tmp % mo;
if (n & ) tmp = (ll)tmp * base % mo;
return tmp;
}
//*************************** int n,m;
const int maxn=+;
int T,head[maxn],fa[maxn],vis[maxn];
struct Edge
{
int u,v;
ll w;
void init(int _u,int _v,ll _w)
{
u=_u,v=_v,w=_w;
}
}edge[maxn*];
int get_f(int u)
{
return u==fa[u]?u:fa[u]=get_f(fa[u]);
}
bool cmp(Edge a,Edge b)
{
return a.w<b.w;
}
struct side
{
int v,next;
ll w;
}e[maxn*];
void init()
{
T=;
ones(head);
zeros(vis);
}
void build(int u,int v,ll w)
{
e[T].v=v;
e[T].w=w;
e[T].next=head[u];
head[u]=T++;
}
void kruskal()
{
sort(edge+,edge++m,cmp);
rep(i,,n)
fa[i]=i;
ll sum=;
rep(i,,m)
{
int f1=get_f(edge[i].u);
int f2=get_f(edge[i].v);
if(f1!=f2)
{
fa[f2]=f1;
build(edge[i].u,edge[i].v,edge[i].w);
build(edge[i].v,edge[i].u,edge[i].w);
sum+=edge[i].w;
//j++;
}
}
printf("%I64d ",sum);
}
double tt;
ll dfs(int u)
{
ll num=,temp=;
vis[u]=;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].v;
ll w=e[i].w;
if(!vis[v])
{
temp=dfs(v);
tt+=1.0*w*(1.0*(n-temp)*temp);
num+=temp;
}
}
return num;
} void sovle()
{
tt=;
dfs();
tt=tt*2.0/(1.0*n*(n-));
printf("%.2lf\n",tt);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T_T;
scanf("%d",&T_T);
for(int kase=;kase<=T_T;kase++)
{
sc(n);
sc(m);
init();
int u,v;
ll w;
rep(i,,m)
{
sc2(u,v);sclld(w);
edge[i].init(u,v,w);
}
kruskal();
sovle();
}
}
最小生成树 kruskal hdu 5723 Abandoned country的更多相关文章
- HDU 5723 Abandoned country 最小生成树+搜索
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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 最小生成树 期望
Abandoned country 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5723 Description An abandoned coun ...
- HDU 5723 Abandoned country(kruskal+dp树上任意两点距离和)
Problem DescriptionAn abandoned country has n(n≤100000) villages which are numbered from 1 to n. Sin ...
- hdu 5723 Abandoned country 最小生成树+子节点统计
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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(最小生成树+边两边点数)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5723 题意:给出一个无向图,每条路都有一个代价,求出把所有城市连通的最小代价.在此基础上,国王会从这 ...
随机推荐
- [moka同学笔记]YII2中发送邮件示例(转载)
原文:http://yiilib.com/topic/675/Yii2%E4%B8%AD%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6%E7%A4%BA%E4%BE%8B { ...
- Mysql denied for user 'odbc@localhost' || denied for user 'root@localhost'
1. Question Description: 1.1 mysql version: mysql-5.7.11-win64.zip 1.2 if you connect to the mys ...
- Jquery_Ajax GET方式传递文本
第一个网页: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...
- Asp.net发布的CheckList
Asp.net Web 应用程序正式发布前,我们还是做一些检查,所以需要这个CheckList,如下图今天的Asp.net 已演化这样的了: 但不管是什么组件,目前的Web最终还得通过H ...
- Python函数:一个简单的迭代
#!/usr/bin/env python # -*- coding: utf-8 -*- def fact(n): if n == 1 : return 1 return n * fact(n-1) ...
- 数码管问题(c++实现)
描述:液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即7有3笔,8有7笔等.对于十个数字一种排列,要做到 两相邻数字都可以由另一个数字加上几笔或减去几笔组成,但不能又加又减. ...
- HTML 块元素
分为3类 1. 结构块 只能包含块级元素.它们包含结构含义,但没有语义含义,也就是,不能说明内容是什么,只能说明其组织方式. <ol> <ul> <dl> < ...
- CSS3随内容自动伸缩的背景
CSS3给我们带来一个非常实用的新属性:border-image,利用这个属性我们可以做出随着内容的增减自动伸缩的背景.废话不多说,看代码! HTML: <ol> <li>第一 ...
- sqlserver 存储过程 try catch TRANSACTION (转)
CREATE PROCEDURE YourProcedure ASBEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...
- Microsoft Dynamics CRM 2013 CD-KEY
Microsoft Dynamics CRM Workgroup Server 2013 (5 CAL limit):NX77Y-BTBCV-JP3T3-8W7JH-94QJP Microsoft D ...