记录编号 308549 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]生日快乐!小埋! 最终得分 100
用户昵称 GravatarFmuckss 是否通过 通过
代码语言 C++ 运行时间 4.632 s
提交时间 2016-09-18 11:13:16 内存使用 0.28 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 105;
const int maxm = 2005;
const int inf = 2e9;


#define is_num(x) (x <= '9' and x >= '0')
inline int get_num() {
	char tmp = getchar();
	int res = 0;
	
	while (not is_num(tmp)) tmp = getchar();
	while (    is_num(tmp)) {
		res = (res << 3) + (res << 1) + tmp - '0';
		tmp = getchar();
	}
	
	return res;
}


struct Edge {
	int fr, to, v;
	double fix;
	Edge() { fr = 0, to = 0, v = 0;}
	Edge(int fr_, int to_, int v_) { fr = fr_, to = to_, v = v_; }
	
	
	bool operator < (const Edge &b) const { 
		return fix < b.fix;
	}
}e[maxm];


int v_mi, v_mx, m, n;


class UnionFindSet {
private:
	int fa[maxn];
public:
	inline void init(int top) {
		for (int i = 1; i <= top; i++) fa[i] = i;
	}
	
	
	inline int get_fa(int now) {
		return fa[now] = fa[now] == now ? now : get_fa(fa[now]);
	}
	
	
	inline void union_set(int u, int v) {
		int fau = get_fa(u), fav = get_fa(v);
		if (fau == fav) return;
		
		fa[fau] = fav;
	}
	
	
	inline bool same(int u, int v) {
		return get_fa(u) == get_fa(v);
	}
}ufs; 


inline double kruskal(double ave) {
	double tot = ave;
	ave /= n - 1;
	for (int i = 1; i <= m; i++) {
		e[i].fix = (ave - e[i].v) * (ave - e[i].v);
	}
	
	sort(e + 1, e + m + 1);
	ufs.init(n);
	double sum = 0;
	double ans = 0;
	int now = 0;
	
	for (int i = 1; i <= m; i++) {
		int u = e[i].fr, v = e[i].to;
		if (ufs.same(u, v)) continue;
		
		sum += e[i].v;
		ans += e[i].fix;
		
		ufs.union_set(u, v);
		if(++now == n - 1) break;
	}
	
	if (tot != sum) return inf;
	return sqrt(ans / (n - 1));
}


inline void read() {
	n = get_num();
	m = get_num();
	int fr, to, v;
	for (int i = 1; i <= m; i++) {
		fr = get_num();
		to = get_num();
		v = get_num();
		e[i] = Edge(fr, to, v);
		e[i].fix = e[i].v;
	}
}


inline void solve() {
	double res = inf;
	
	sort(e + 1, e + m + 1);
	for (int i = 1; i <= n - 1; i++) {
		v_mi += e[i].v;
		v_mx += e[m - i + 1].v;
	}
	
	for (int i = v_mi; i <= v_mx; i++) {
		res = min(res, kruskal(i));
	}
	
	printf("%.4lf\n", res);
}


int main() {
	freopen("happy_birthday.in", "r", stdin);
	freopen("happy_birthday.out", "w", stdout);
	read();
	solve();
	return 0;
}