题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3754 题解 感觉这个思路挺神仙的. 后悔没有好好观察题目的数据范围,一直把 \(n\) 和 \(m\) 当成 1e5 来思考,\(c\) 竟然也只有 \(100\). 有了数据范围以后可以发现,边权和位于 \(nc\) 级别,大概就是 \(10000\) 左右. 所以我们可以考虑枚举边权和,从而得到边权的平均数. 然后我们给每一条边的边权赋值为 \((\)原始边权 \(-\) 平均数\()^…
[BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000)\)条边的带权无向图,每条边的边权为\(w_i(w_i\le50)\).求最小方差生成树. 3080数据范围:\(n\le50,m\le1000,w_i\le50\): 3754数据范围:\(n\le100,m\le1000,w_i\le100\). 其中3754询问的是最小标准差. 思路: 由于…
3754: Tree之最小方差树 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 402  Solved: 152[Submit][Status][Discuss] Description Wayne在玩儿一个很有趣的游戏.在游戏中,Wayne建造了N个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M对城市间能修公路,即有若干三元组 (Ui,Vi,Ci)表示Ui和Vi间有一条长度为Ci的双向道路.…
题目描述 给出一张无向图,求它的一棵生成树,使得选出的所有边的方差最小.输出这个最小方差. 输入 第一行两个正整数N,M 接下来M行,每行三个正整数Ui,Vi,Ci N<=100,M<=2000,Ci<=100 输出 输出最小的标准差,保留四位小数. 样例输入 3 3 1 2 1 2 3 2 3 1 3 样例输出 0.5000 题解 最小生成树 由于Ci很小,因此选出边的总和不会很大.可以考虑枚举这个总和(即平均值). 然后把每条边的边权看作 $|c_i-\bar c|$ ,跑最小生成树…
发现,若使方差最小,则使Σ(wi-平均数)2最小即可. 因为权值的范围很小,所以我们可以枚举这个平均数,每次把边权赋成(wi-平均数)2,做kruscal. 但是,我们怎么知道枚举出来的平均数是不是恰好是我们的这n-1条边的呢? 就在更新答案的时候加个特判就行了. #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; #defin…
题目大意: 求最小方差生成树.N<=100,M<=2000,Ci<=100 题解: 首先我们知道这么一个东西: 一些数和另一个数的差的平方之和的最小值在这个数是这些数的平均值时取得 所以我们可以枚举这个平均数,然后计算所有边与该值的差的平方 然后扔下去跑一个最小生成树 然后我们通过枚举这个平均数发现这个平均数和答案的对应函数的图像是一个波形函数 所以我们可以直接在这个波形图像上找函数最低点: 相应的就有 爬山算法 模拟退火 两种算法 所以我们可以先在全局用模拟退火然后在局部用爬山算法.…
题目链接: TP 题解: 都是骗子233,我还以为是什么神奇的算法. 由于边权的范围很小,最小生成树和最大生成树之间的总和差不会太大,所以可以枚举边权和,再直接根据方差建最小生成树,每次更新答案即可. 代码: #define Troy #include <bits/stdc++.h> using namespace std; inline int read(){ ,k=;char ch=getchar(); :,ch=getchar(); &ch<=+(ch^),ch=getch…
Description Wayne 在玩儿一个很有趣的游戏.在游戏中,Wayne 建造了N 个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M 对城市间能修公路,即有若干三元组(Ui, Vi,Ci) 表示Ui 和Vi 间有一条长度为Ci 的双向道路.当然,游戏保证了,若所有道路都修建,那么任意两城市可以互相到达. Wayne 拥有恰好N - 1 支修建队,每支队伍能且仅能修一条道路.当然,修建长度越大,修建的劳累度也越高,游戏设定是修建长度为C…
http://www.lydsy.com/JudgeOnline/problem.php?id=3754 核心思想:暴力枚举所有可能的平均数,对每个平均数排序后Kruskal. 正确的答案一定是最小的,枚举到正确的平均数后一定会算出正确答案. 枚举的平均数太多了,险些TLE.每两个相邻的整数\(a\),\(b\)\((a<b)\)之间枚举\(a+\frac13\),\(a+\frac23\)两个值作为平均数就可以了(虽然不是正确的答案的平均数,但和正确的答案的平均数排序之后的序列是相同的).我并…
枚举平均数. mdzz编译器. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxv 100500 #define maxe 200500 using namespace std; ,r=,father[maxv],rank[maxv]; double ans=999999999999999999…