清北学堂模拟赛d6t5 侦探游戏
分析:简化一下题意就是给任意两对点连一条权值为0的边,求出每次连边后最小生成树的权值和*2/(n - 1) * n.
每次求最小生成树肯定会爆炸,其实每次加边只是会对最小生成树上的一条边有影响,也就是加入这条边权为0的边后形成的环上权值最大的边,我们可以每次在树上倍增找到这条边,可以通过60%的点.
最小生成树的变形题都有一个思路,就是当我们无法继续优化的时候我们就思考一下克鲁斯卡尔算法的原理,因为每条边是按照边权从小到大加入的,所以在加入这条边的时候,这条边两端连的点对之间连一条权值为0的边,所形成的环上的最大权值的边一定是新加入的这条边,利用乘法原理统计一下点对数就可以了.
#include <bits/stdc++.h> using namespace std;
int n,m,fa[],num[];
long long cnt,ans; struct node
{
int u,v,w;
}e[]; bool cmp(node a,node b)
{
return a.w < b.w;
} int find(int x)
{
if (x == fa[x])
return x;
return fa[x] = find(fa[x]);
} void hebing(int x,int y)
{
num[x] += num[y];
num[y] = ;
fa[y] = x;
} int main()
{
scanf("%d%d",&n,&m);
for (int i = ; i <= n; i++)
{
fa[i] = i;
num[i] = ;
}
for (int i = ; i <= m; i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e + ,e + + m,cmp);
for (int i = ; i <= m; i++)
{
int fu = find(e[i].u),fv = find(e[i].v);
if (fu != fv)
{
ans += e[i].w;
cnt += 1LL * num[fu] * num[fv] * e[i].w;
hebing(fu,fv);
}
}
double temp = ans - 2.0 * cnt / n / (n - );
printf("%.2lf",temp); return ;
}
清北学堂模拟赛d6t5 侦探游戏的更多相关文章
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d6t6 棋盘迷宫
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...
- 清北学堂模拟赛d1t6 或和异或(xor)
题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一 ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛day7 石子合并加强版
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- 清北学堂模拟赛d1t1 位运算1(bit)
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...
- 清北学堂模拟赛d2t6 分糖果(candy)
题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...
随机推荐
- bzoj3661
网络流/贪心 网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l.时限100s,能跑过去我的太慢了,一个点100s 正解 ...
- Rails5 Route Document
创建: 2017/06/29 完成: 2017/06/29 更新: 2017/06/30 最开头的有效路径展示补充网页版 更新: 2017/07/21 修正错别字 更新: 2017/09/02 增加m ...
- 北大zhw大神bzoj1756代码
#include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> #i ...
- Python基础数据类型(四) tuple元祖
元祖tuple(,) 元祖就是不可变的列表 元祖用()表示,元素与元素之间用逗号隔开,数据类型没有限制 tu = ('科比','詹姆斯','乔丹') tu = tuple('123') 小括号中 有一 ...
- ACM_求交集
求交集 Time Limit: 2000/1000ms (Java/Others) Problem Description: 输入集合A和B,按大小顺序输出A和B的交集. Input: 输入包含多组测 ...
- TCP简要讲解
TCP被称为面向连接.面向流,可靠的传输层协议.它与UDP最大的不同在于它是可靠性的,所以需要可靠传输的时候就需要用到TCP,如果需要快速传输则选择UDP. TCP的连接又称为3次握手. 1).客 ...
- CUDA-GPU编程
参考:http://blog.csdn.net/augusdi/article/details/12833235 第二节 新建NVIDIA项目: 新建项目及会生成一个简单的代码demo,计算矩阵的加 ...
- Mongodb——文档数据库
mongodb是一个文档数据库. mongo操作 多个修改操作,但每个修改携带的数据包较小,可操作考虑批量操作.bulkWrite()改善性能. MongoCollection是线程安全的. db.c ...
- c#——值类型与引用类型
值类型传的是值 引用类型传的是地址
- 2016.01.08 Javascript视频
完成JavaScript开发视频课程的Ajax部分内容.