比赛 至少完成十道练习 评测结果 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;
}