Hdu 1879 - 继续通畅工程

最小生成树 - prim算法

 

题意:n为村庄数,n*(n-1)/2 为村庄之间的路数,求最小的路的总长度。加入的变化时判断该路是否已经建成,若是则将map[][]置为0;若不是,则将map[][]置为该路的长度。

 

AC代码:

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

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

int MinTree(int n)
{
    int min,sum,flag,i,j;
    memset(low, 0, sizeof(low));
    for(i=2; i<=n; i++)
    {
        low[i] = map[1][i];
    }
    memset(v, 0, sizeof(v));
    v[1] = 1;
    sum = 0;
    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[j]; 若执行这句而不是下面一句的话,所有结果都是0。
        sum += min;
        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,a,b,c,f;
    while(scanf("%d",&n),n)
    {
        h = n*(n-1)/2;
        for(i=1; i<=h; i++)
        {
            scanf("%d%d%d%d",&a,&b,&c,&f);
            if(f)
            {
                map[a][b] = map[b][a] = 0;
            }
            else
            {
                map[a][b] = map[b][a] = c;
            }
        }
        printf("%d\n",MinTree(n));
    }
    return 0;
}


 

 

 

 

你可能感兴趣的:(Hdu 1879 - 继续通畅工程)