Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
54835 | 李言 | 最优布线问题 | C++ | 通过 | 100 | 3 MS | 376 KB | 711 | 2022-07-29 17:26:09 |
#include<bits/stdc++.h> using namespace std; int n,m,ans,k; struct bian{ int a,b,w; }sb[114514]; void add(int u,int v,int w,int i){ sb[i].a=u,sb[i].b=v,sb[i].w=w; } int p[19198]; int cmp(bian a,bian b){ return a.w<b.w; } void init(){ for(int i=1;i<=n;i++)p[i]=i; } int find(int x){ if(p[x]!=x) find(p[x]); else return p[x]; } void merge(int a,int b){ p[b]=a; } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int a; cin>>a; add(i,j,a,++k); } } sort(sb+1,sb+n*n+1,cmp); init(); for(int i=1;i<=n*n;i++){ if(find(sb[i].a)!=find(sb[i].b)){ merge(find(sb[i].a),find(sb[i].b)); ans+=sb[i].w; } } cout<<ans; return 0; }