题目描述 Description
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。 每两个农场间的距离不会超过100000
输入描述 Input Description
第一行: 农场的个数,N(3<=N<=100)。
第二行..结尾: 接下来的行包含了一个N*N的矩阵,表示每个农场之间的距离。
输出描述 Output Description
只有一个输出,是连接到每个农场的光纤的最小长度和。
样例输入 Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样例输出 Sample Output
28
#include <stdio.h>
#define M 105
int main(void)
{
int n=0; //输入农场的数目
int distance[M][M]; //各农场之间的距离
int visited[M]={0}; //记录已经联通的农场
int minDistance[M]={0}; //记录各农场距离最小生成树的最小距离
int i=0,j=0,k=0; //用来对distance数组进行遍历
int sum=0; //链接农场所需最短的光纤
int min=0; //用来寻找距当前农场最短距离的农场
int tmp=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",*(distance+i)+j);
}
}
//初始化,从第一个农场开始,此时各点距离最小生成树的最短距离就是距离这个点的距离
visited[0]=1;
for(i=0;i<n;i++)
{
minDistance[i] = distance[0][i];
}
for(i=1;i<n;i++)
{
min = 999999;
//选取距离最小生成树距离最短的一个农场
for(j=0;j<n;j++)
{
if(!visited[j]&&min>minDistance[j])
{
min = minDistance[j];
k = j;
}
}
visited[k] = 1;
sum+=min;
//因为新加入一个点,所以对于各点距离最小生成树的最短距离发生变化,进行比较得出新的最短的
for(j=0;j<n;j++)
{
if(!visited[j]&&minDistance[j]>distance[k][j])
{
minDistance[j] = distance[k][j];
}
}
}
printf("%d",sum);
return 0;
}