记录编号 458910 评测结果 AAAAAAAAAA
题目名称 [USACO 3.1] 最短网络 最终得分 100
用户昵称 GravatarWHZ0325 是否通过 通过
代码语言 C++ 运行时间 0.012 s
提交时间 2017-10-11 22:02:26 内存使用 0.35 MiB
显示代码纯文本
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
//union set
int fa[105];
void init(int n) {
	for(int i=0;i<n;i++) {
		fa[i]=i;
	}
}
int find(int x) {
	int root=x;
	while(root!=fa[root]) {
		root=fa[root];
	}
	while(fa[x]!=root) {
		int t=fa[x];
		fa[x]=root;
		x=t;
	}
	return root;
}
void union_set(int x,int y) {
	fa[find(x)]=find(y);
}
bool same(int x,int y) {
	return find(x)==find(y);
}
struct edge {
	int x,y,l;
	bool operator < (const edge &b) const {
		return l<b.l;
	}
};
vector<edge> edges;
int d[105][105];
int kruskal(int n) {
	for(int i=0;i<n;i++) {
		for(int j=0;j<i;j++) {
			edges.push_back((edge){i,j,d[i][j]});
		}
	}
	sort(edges.begin(),edges.end());
	int ans=0;
	init(n);
	for(int i=0;i<edges.size();i++) {
		if(!same(edges[i].x,edges[i].y)) {
			union_set(edges[i].x,edges[i].y);
			ans+=edges[i].l;
		}
	}
	return ans;
}
int main() {
	freopen("agrinet.in","r",stdin);
	freopen("agrinet.out","w",stdout);
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++) {
		for(int j=0;j<n;j++) {
			scanf("%d",&d[i][j]);
		}
	}
	printf("%d\n",kruskal(n));
	fclose(stdin);
	fclose(stdout);
	return 0;
}