最小生成树 - 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; }