zoj 1586( prim)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int const maxn = 1000000;
int map[1010][1010];
int adapt[1010];
int lowcost[1010];
int t;
int n;

void init(){
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &adapt[i]);
    }
    for(int i = 0; i < n; i++) {
        for(int k = 0; k < n; k++) {
            scanf("%d", &map[i][k]);
            if(i == k) { map[i][k] = maxn; }
            else { map[i][k] += (adapt[i] + adapt[k]); }
        }
    }
    memset(lowcost, 0, sizeof(lowcost));
}

void prim() {
    int sum = 0;
    lowcost[0] = -1;
    for(int i = 1; i < n; i++) {
        lowcost[i] = map[0][i];
    }
    int i, j, k;
    for( i = 1; i < n; i++) {
        int minx = maxn;
        for(k = 0; k < n; k++) {
            if(lowcost[k] != -1 && lowcost[k] < minx) {
                j = k;
                minx = lowcost[k];
            }
        }
        sum += minx;
        lowcost[j] = -1;//
        for(k = 0; k < n; k++) {
            if(map[j][k] < lowcost[k]) {
                lowcost[k] = map[j][k];
            }
        }
    }
    printf("%d\n", sum);
}

int main()
{
    scanf("%d", &t);
    for(int i = 0; i < t; i++) {
        init();
        prim();
    }
    return 0;
}
/**************
4
3
10 20 30
0 100 200
100 0 300
200 300 0

*************/

你可能感兴趣的:(zoj 1586( prim))