比赛 ICPC复现(AI数据) 评测结果 AAAAA
题目名称 最小生成图 最终得分 100
用户昵称 RpUtl 运行时间 0.147 s
代码语言 C++ 内存使用 4.00 MiB
提交时间 2026-05-26 20:23:32
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=5e3+10;
int n,m,f[N],a[N],b[N],ta,tb;
double ans,tmp;
int found(int x){
	return f[x]==x?x:f[x]=found(f[x]);
}
struct edge{int u,v,w;}e[N];
int main(){
	freopen("tu.in","r",stdin);
	freopen("tu.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=1,u,v,w;i<=m;i++){
		scanf("%d %d %d",&u,&v,&w);
		e[i]=edge{u,v,w};
	}
	sort(e+1,e+1+m,[&](edge a,edge b){
		return a.w<b.w;
	});
	double ans=1e15;
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++){
		int u=found(e[i].u);
		int v=found(e[i].v);
		if(u==v){
			b[++tb]=e[i].w;
		}else{
			f[u]=v;
			a[++ta]=e[i].w;
		}
	}
	sort(a+1,a+1+ta);
	sort(b+1,b+1+tb);
	tmp=0;
	for(int i=1;i<=ta;i++)tmp+=(double)(1.0*a[i]/i);
	ans=min(ans,tmp);
	for(int i=1;i<=tb;i++){
		a[++ta]=b[i];
		for(int j=ta-1;j>=1;j--)if(a[j]>a[j+1])swap(a[j],a[j+1]);
		tmp=0;
		for(int j=1;j<=ta;j++)tmp+=(double)(1.0*a[j]/j);
		ans=min(ans,tmp);
	}
	printf("%.0lf\n",round(ans));
	return 0;
}