比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 最优布线问题 最终得分 100
用户昵称 FFF团 运行时间 2.677 s
代码语言 C++ 内存使用 26.10 MiB
提交时间 2017-05-21 13:27:56
显示代码纯文本
#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1501;
struct edge{
	int u,v,cost;
};
edge edge[maxn*maxn];
struct edge e;
bool cmp(struct edge a,struct edge b){
	return a.cost<b.cost;
}
int n,t,s=1,ans;
int fa[maxn];
int find(int x){
	if(fa[x]==x)return x;
	else return fa[x]=find(fa[x]);
}
int main(){
	freopen("wire.in","r",stdin);
	freopen("wire.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		fa[i]=i;
		scanf("\n");
		for(int j=1;j<=n;j++){
		    scanf("%d ",&t);
			if(!t)continue;
			e.cost=t;
			e.u=i;
			e.v=j;
			edge[s]=e;
			s++;
		}
	}
	sort(edge+1,edge+s,cmp);
	for(int i=1;i<s;i++){
		e=edge[i];
		int f1=find(e.u);
		int f2=find(e.v);
		if(f1!=f2){
			fa[f1]=f2;
			ans+=e.cost;
		}
		
	}
	printf("%d\n",ans);
	return 0;
}