题目描述
学校有 n 台计算机,编号是 1∼n,为了方便数据传输,现要将它们用数据线连接起来,同一条数据线中数据的传输可以是 双向 的。
两台计算机被连接是指它们有数据线连接。
由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。
当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。
为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。
现在由你负责连接这些计算机,任务是使任意两台计算机都连通(不管是直接的或间接的)。
输入格式
第一行为整数 n,表示计算机的数目。
此后的 n 行,每行 n 个整数,输入一个对角线上全部是0的 对称矩阵。
其中第 x+1 行 y 列的整数表示直接连接第 x 台计算机和第 y 台计算机的费用。
输出格式
一个整数,表示最小的连接费用。
数据范围
2≤n≤100,
连接任意两台计算机的费用均是非负整数且不超过10000。
样例
输入样例:
3
0 1 2
1 0 1
2 1 0
输出样例:
2
算法1
模板最小生成树
C++ 代码
#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int father[100100];
struct node
{
int s,e,val;
}tree[100100];
bool cmp(node x,node y)
{
return x.val<y.val;
}
void init(int n)
{
for(int i=0;i<=n;i++)
{
father[i]=i;
}
}
int find(int x)
{
if(father[x]==x)
{
return x;
}
return father[x]=find(father[x]);
}
void mergy(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx==fy)
{
return;
}
father[fx]=fy;
}
int main()
{
int n,t=0,ans=0,cnt=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&tree[t].val);
tree[t].s=i;
tree[t++].e=j;
}
}
init(n);
sort(tree,tree+t,cmp);
for(int i=0;i<t;i++)
{
if(find(tree[i].s)!=find(tree[i].e))
{
cnt++;
ans+=tree[i].val;
mergy(find(tree[i].s),find(tree[i].e));
}
if(cnt==n-1)
{
break;
}
}
printf("%d\n",ans);
}