Hdu 1233 - 还是通畅工程

最小生成树 - prim算法

 

题意:n为村庄数,n*(n-1)/ 2 为村庄之间的路数,求出最小的路的总长度。

 

AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int max = 0x7ffffff;
int map[105][105], v[5000], low[5000];
int n,h;

int MinTree(int n)
{
    int min, sum = 0, flag, i, j, h;
    memset(v, 0, sizeof(v));
    memset(low, 0, sizeof(low));
    v[1] = 1;
    h = n*(n-1)/2;
    for(i=2; i<=n; i++)
    {
        low[i] = map[1][i];
    }
    for(i=2; i<=n; i++)
    {
        min = max;
        flag = -1;
        for(j=1; j<=n; j++)
        {
           if(!v[j] && low[j]<min)
           {
               min = low[j];
               flag = j;
           }
        }
        sum += low[flag];
        v[flag] = 1;
        for(j=1; j<=n; j++)
        {
            if(!v[j] && map[flag][j]<low[j])
            {
                low[j] = map[flag][j];
            }
        }
    }
    return sum;
}

int main()
{
    int i, j, a, b, dis;
    while(scanf("%d", &n)!=EOF)
    {
        if(n == 0) break;
        h = n*(n-1)/2;
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
            {
                if(i==j) map[i][j] = 0;
                else map[i][j] = max;
            }
        for(i=1; i<=h; i++)
        {
            scanf("%d%d%d", &a, &b, &dis);
            if(map[a][b] > dis)
            {
                map[a][b] = dis;
                map[b][a] = dis;
            }
        }
        printf("%d\n", MinTree(n) );
    }
    return 0;
}


 

你可能感兴趣的:(Hdu 1233 - 还是通畅工程)