| 比赛 |
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;
}