qaq,现在内心真是各种草泥马。怪自己见识短浅。。。哎。。。

题意:

给你一幅图,然后求一个最小花费使得所有的点都连通(这就是最小生成树啊),然后在这棵树上【如果我要从任意起点到任意终点,这两个点不同,且这两个点的被选取概率都是一样,求一个最小的期望长度,我的神队友的解释就是树上所有任意不同点之间的边值都加起来然后除以边的数量】

思路:

①:最小生成树;

②:求一个所有边之和/边的数量,一个边的贡献,对总和的贡献,就是任意两点之和,这个边被加了多少次,那就用这个边把树分成两部分,一部分有a个点,一部分有b个。那这个边就被加了a*b个点,那这个边就被加了a*b个次。

= =、以上纯属YY,路人勿喷。

利用树的构造,查找儿子节点个数。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=998244353;
const LL INF=0x3f3f3f3f;
const int N=1e5+10;
struct asd{
int to;
int next;
};
asd q[N];
int head[N],tol;
int sz[N]; void add(int a,int b)
{
q[tol].to=b;
q[tol].next=head[a];
head[a]=tol++;
} void dfs(int root,int father)
{
sz[root]=1;
for(int i=head[root];i!=-1;i=q[i].next)
{
int son=q[i].to;
if(son==father) continue;
dfs(son,root);
sz[root]+=sz[son];
}
} int main()
{
int n,m;
while(1){
cin>>n>>m;
tol=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
dfs(1,-1);
for(int i=2;i<=n;i++){
printf("第%d个点:\n",i);
printf("左:%d 右:%d\n",sz[i],n-sz[i]);
}
}
}



qaq , 实在看不懂就只能调试知道算法…然后就会知道这个算法就是找该节点的儿子数目(包括他本身)。

然后边的权值就是节点到前面那个父亲节点的距离。找儿子这波操作真是血亏。。。智障题。。

比赛的时候数组还开小了…T了N发还以为不行。。。虽然后来证明是不行。。。

瞎扔一份代码跑….

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const double eps=1e-6;
const double pi=acos(-1.0);
const int mod=998244353;
const LL INF=0x3f3f3f3f;
const int N=1e5+10;
struct asd{
int x,y;
LL num;
};
struct ad{
LL w;
int to;
int next;
};
ad ma[N*20];
int tol,head[N*20]; asd qq[N*10];
asd q[N*10];
int pre[N];
int vis[N];
int n;
LL val[N];
int sb[N]; bool cmp(asd z,asd x)
{
if(z.num<x.num)
return 1;
return 0;
}
void Init()
{
for(int i=1;i<=n;i++)
pre[i]=i;
}
int Find(int x)
{
int r=x;
while(r!=pre[r])
{
r=pre[r];
}
int i=x,j;
while(pre[i]!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void add(int a,int b,LL c)
{
ma[tol].w=c;
ma[tol].to=b;
ma[tol].next=head[a];
head[a]=tol++;
}
void dfs(int u,int v)
{
sb[u]=1;
for(int i=head[u];i!=-1;i=ma[i].next){
int tt=ma[i].to;
if(tt==v) continue;
val[tt]=ma[i].w;
dfs(tt,u);
sb[u]+=sb[tt];
}
}
int main()
{
int t;
cin>>t;
while(t--){
int m,a,b;
LL c;
scanf("%d%d",&n,&m);
LL temp;
temp=(LL)n*(n-1)*0.5;
Init();
for(int i=0;i<m;i++)
{
scanf("%d%d%lld",&a,&b,&c);
q[i].x=a;
q[i].y=b;
q[i].num=c;
}
sort(q,q+m,cmp);
LL ans=0;
tol=0;
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
int aa=Find(q[i].x);
int bb=Find(q[i].y);
if(aa!=bb)
{
add(q[i].x,q[i].y,q[i].num);
add(q[i].y,q[i].x,q[i].num);
pre[aa]=bb;
ans+=q[i].num;
}
}
dfs(1,0);
LL sum=0;
for(int i=2;i<=n;i++){
sum+=val[i]*sb[i]*(n-sb[i]);
}
if(n==1)
printf("%lld 0.00\n",ans);
else
printf("%lld %.2lf\n",ans,(double)sum/(double)temp);
}
return 0;
}
/* 100
4 6
1 2 1
2 3 2
3 4 3
4 1 4
1 3 5
2 4 6
5 4
1 2 1
3 4 2
2 3 3
2 5 4
6 5
1 6 4
1 2 3
2 5 2
2 3 1
3 4 2
*/

2016 Multi-University Training Contest 1Abandoned country的更多相关文章

  1. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  2. 2016 Al-Baath University Training Camp Contest-1 E

    Description ACM-SCPC-2017 is approaching every university is trying to do its best in order to be th ...

  3. 2016 Al-Baath University Training Camp Contest-1 A

    Description Tourist likes competitive programming and he has his own Codeforces account. He particip ...

  4. 2016 Al-Baath University Training Camp Contest-1 J

    Description X is fighting beasts in the forest, in order to have a better chance to survive he's gon ...

  5. 2016 Al-Baath University Training Camp Contest-1 I

    Description It is raining again! Youssef really forgot that there is a chance of rain in March, so h ...

  6. 2016 Al-Baath University Training Camp Contest-1 H

     Description You've possibly heard about 'The Endless River'. However, if not, we are introducing it ...

  7. 2016 Al-Baath University Training Camp Contest-1 G

    Description The forces of evil are about to disappear since our hero is now on top on the tower of e ...

  8. 2016 Al-Baath University Training Camp Contest-1 F

    Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...

  9. 2016 Al-Baath University Training Camp Contest-1 D

    Description X is well known artist, no one knows the secrete behind the beautiful paintings of X exc ...

随机推荐

  1. HDU 4422 The Little Girl who Picks Mushrooms(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4422 Problem Description It's yet another festival s ...

  2. Visual Studio VS如何统计代码行数

    编辑-查找和替换-在文件中查找,然后查找内容填写下面的东西,勾选使用正则表达式,点击查找全部 b*[^:b#/]+.*$   在查找结果的最后一行显示了总的行数和文件数                 ...

  3. weexapp 开发流程(二)框架搭建

    1.创建 入口文件 src / entry.js /** * 入口文件 */ import App from './App.vue' import router from './router' // ...

  4. 字符串类型ip与数值型ip地址相互转换

    /** * 返回Integer类型的ip地址 * @return */ private static Integer ipToInt(){ String ip="192.168.1.201& ...

  5. [转载]php 数组 类对象 值传递 引用传递 区别

    一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...

  6. POJ--2284--That Nice Euler Circuit【平面图欧拉公式】

    链接:id=2284">http://poj.org/problem?id=2284 题意:一个自己主动绘图的机器在纸上(无限大)绘图,笔尖从不离开纸,有n个指令,每一个指令是一个坐标 ...

  7. 使用ucontext组件实现的coroutine代码分析

    coroutine一般翻译过来就是协程,类似于线程可以切换,而跟线程是由操作系统调度器来实现切换不一样,协程由用户程序自己调度进行切换.我以前也看过协程相关的内容,但没有自己去实现过.最近搞OpenS ...

  8. js编程精解--笔记

    看这本书的目的是为了更好的使用mongodb,所以只看js编程语言基础,不看浏览器和画布. 需要看1-11章,共160页 第一章 值.类型和运算符 第二章 程序结构 第三章 函数 第四章 数据结构:对 ...

  9. iOS 开发常用的调试工具

    前言 最近博主临近毕业季,为了完美的写一篇毕业论文,真是:“锄禾日当午,汗滴禾下土”<—— 这句诗跟毕业我写毕业论文没任何一毛钱关系,我就是突然想吟湿了.不过博主作为网络工程专业的好青年,曾经的 ...

  10. Spark基本原理

    仅作<Spark快速大数据分析>学习笔记 定义:Spark是一个用来实现 快速 而 通用 的集群计算平台:(通用的大数据处理引擎:) 改进了原Hadoop MapReduce处理模型,体现 ...