标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 20154 | Accepted: 9291 |
Description
Input
Output
Sample Input
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0
Sample Output
216 30
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 using namespace std; 6 7 int n; 8 int dis[30][30]; 9 int minDis[30]; 10 int vis[30]; 11 12 int Prim(){ 13 int i,j,sum = 0; 14 memset(vis, 0, sizeof(vis)); 15 memset(minDis, 0, sizeof(minDis)); 16 for (i = 0; i < n; i++) 17 minDis[i] = dis[0][i];//开始集合里只有一个点,大家到集合的距离即为到第一个点的距离 18 vis[0] = 1; 19 int num=n-1,jilu=0; 20 while (num--){ 21 int min = 1000; 22 for (i = 0; i < n; i++){ 23 if (!vis[i]&&minDis[i] < min){ 24 min = minDis[i];//更新min 25 jilu = i; 26 } 27 } 28 // cout <<"加入的点是:"<<jilu<< " sum+的min是:" << min << endl; 29 //if (min!=1000) 30 sum += min; 31 vis[jilu] = 1;//新的jilu点进集合 32 for (j = 0; j < n; j++){//更新点到集合的最短距离 33 if (vis[j]) 34 continue; 35 else if (minDis[j]>dis[jilu][j]) 36 minDis[j] = dis[jilu][j]; 37 } 38 } 39 40 return sum; 41 } 42 43 int main() 44 { 45 while (cin >> n&&n!=0){ 46 int i, j, k, x, y, w, m; 47 char a, b; 48 for (i = 0; i < n; i++) 49 for (j = 0; j < n; j++) 50 dis[i][j] = dis[j][i] = 1000; 51 for (i = 0; i < n - 1; i++){ 52 cin >> a >> m; 53 if (m > 0){ 54 for (j = 0; j < m; j++){ 55 cin >> b >> w; 56 x = a - ‘A‘; 57 y = b - ‘A‘; 58 dis[x][y] = dis[y][x] = w; 59 } 60 } 61 } 62 cout << Prim() << endl; 63 } 64 return 0; 65 }
poj 1251--Jungle Roads(求最小生成树)
标签:
原文地址:http://www.cnblogs.com/lxzd723/p/4405339.html