http://acm.hdu.edu.cn/showproblem.php?pid=1233
Prim:
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #define MAX 99999 4 #define M 110 5 int dis[M] ; 6 int map[M][M] ; 7 bool vis[M] ; 8 void init() 9 { 10 for(int i=0; i<M; i++) 11 for(int j=0; j<M; j++) 12 { 13 if(i==j) map[i][j] = 0 ; 14 map[i][j] = MAX ; 15 } 16 } 17 int prim(int n) 18 { 19 int i, j, min, pos ; 20 int sum = 0 ; 21 memset(vis, 0, sizeof(vis)) ; 22 for(i=1; i<=n; i++) 23 dis[i] = map[1][i] ; 24 vis[1] = true ; 25 dis[1] = MAX ; 26 for(i=2; i<=n; i++) 27 { 28 min = MAX ; 29 for(j=1; j<=n; j++) 30 { 31 if(!vis[j]&&dis[j]<min) 32 { 33 min = dis[j] ; 34 pos = j ; 35 } 36 } 37 sum += dis[pos] ; 38 vis[pos] = true ; 39 for(j=1; j<=n; j++) 40 { 41 if(!vis[j]&&dis[j]>map[pos][j]) 42 { 43 dis[j] = map[pos][j] ; 44 } 45 } 46 } 47 return sum ; 48 } 49 int main() 50 { 51 int a, b, c, n ; 52 while(scanf("%d", &n), n) 53 { 54 init() ; 55 for(int i=1; i<=n*(n-1)/2; i++) 56 { 57 scanf("%d%d%d", &a,&b, &c) ; 58 if(map[a][b]>c) 59 map[a][b] = map[b][a] = c ; 60 } 61 printf("%d\n", prim(n)) ; 62 } 63 return 0 ; 64 }