记录编号 |
458910 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO 3.1] 最短网络 |
最终得分 |
100 |
用户昵称 |
WHZ0325 |
是否通过 |
通过 |
代码语言 |
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;
}