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