POJ 1258 - Agri-Net

已经能熟练地将MST的模板敲出,1A最小生成树的裸题。只要掌握了算法的细节,理解透彻,就没什么难度了。

 

AC代码:

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

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

int MinTree(int n)
{
    int min, sum, flag, i, j;
    memset(low, 0, sizeof(low));
    memset(v, 0, sizeof(v));
    for(i=1; i<=n; i++)
    {
        low[i] = map[1][i];
    }
    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 += min;
        v[flag] = 1;
        for(j=1; j<=n; j++)
        {
            if(!v[j] && low[j]>map[flag][j])
            {
                low[j] = map[flag][j];
            }
        }
    }
    return sum;
}

int main()
{
    int i,j;
    while(~scanf("%d",&n))
    {
        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<=n; i++)
            for(j=1; j<=n; j++)
            {
                scanf("%d",&map[i][j]);
            }
        printf("%d\n",MinTree(n));
    }
    return 0;
}


 

你可能感兴趣的:(POJ 1258 - Agri-Net)