比赛 |
至少完成十道练习 |
评测结果 |
AAAAAAAAAA |
题目名称 |
最优布线问题 |
最终得分 |
100 |
用户昵称 |
Mealy |
运行时间 |
1.676 s |
代码语言 |
C++ |
内存使用 |
0.34 MiB |
提交时间 |
2017-05-22 19:16:52 |
显示代码纯文本
//457
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
using namespace std;
const int nmax=1586;
int n;
int tmp;
int ans=0;
int f[nmax];
class poi{
public:
int l,r;
int len;
};
vector<poi> edges;
vector<int> G[nmax];
inline void PreDo(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&tmp);
if(i<j)
edges.pb((poi){i,j,tmp});
}
}
}
inline void SetSet(){
for(int i=1;i<=n;i++){
f[i]=i;
}
}
inline int Find(int x){
if(x==f[x]) return x;
else f[x]=Find(f[x]);
return f[x];
}
inline void Merge(int a,int b){
int fa,fb;
fa=Find(a);
fb=Find(b);
f[fa]=fb;
}
inline bool cmp(poi a,poi b){
return a.len<b.len;
}
int main(){
freopen("wire.in","r",stdin);
freopen("wire.out","w",stdout);
PreDo();
SetSet();
sort(edges.begin(),edges.end(),cmp);
for(int i=0;i<edges.size();i++){
if(Find(edges[i].l)!=Find(edges[i].r)){
ans+=edges[i].len;
Merge(edges[i].l,edges[i].r);
}
}
printf("%d",ans);
return 0;
}