最小生成树。
Prim 算法。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 int map[102][102]; 8 9 int prim(int n) 10 { 11 int i, j, min, sum=0; 12 int pos, vis[102], d[102]; 13 memset(vis, 0, sizeof(vis)); 14 for (i=1; i<=n; i++) 15 d[i]=map[1][i]; 16 vis[1]=1; 17 for (i=1; i<n; i++) 18 { 19 min=10000000; 20 for (j=1; j<=n; j++) 21 { 22 if (vis[j] == 0 && min >= d[j]) 23 { 24 min=d[j]; 25 pos=j; 26 } 27 } 28 vis[pos]=1; 29 sum+=min; 30 for (j=2; j<=n; j++) 31 { 32 if (vis[j] == 0 && d[j] > map[pos][j]) 33 { 34 d[j]=map[pos][j]; 35 } 36 } 37 } 38 return sum; 39 } 40 41 int main() 42 { 43 int n, m, i, j; 44 int a, b, d, sum; 45 while(scanf("%d%d", &n ,&m) && n) 46 { 47 for (i=0; i<=m; i++) 48 for (j=0; j<=m; j++) 49 map[i][j]=10000000; 50 for (i=0; i<=m; i++) 51 map[i][i]=0; 52 for (i=0; i< n; i++) 53 { 54 scanf("%d%d%d", &a, &b, &d); 55 map[a][b]=map[b][a]=d; 56 } 57 sum=prim(m); 58 if (sum >= 10000000) printf("?\n"); 59 else 60 printf("%d\n", sum); 61 } 62 }