您的位置:首页 > 其它

CODEVS上关于最小生成树的一个题目

2018-01-25 18:07 344 查看
题目描述 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小生成树