题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2403

  1. #include <iostream> 
  2. #include <limits> 
  3. using namespace std;  
  4.  
  5. int n;  
  6. const int MAX_VETEXT_NUM = 27;  
  7. int map[MAX_VETEXT_NUM][MAX_VETEXT_NUM];  
  8. int closedge[MAX_VETEXT_NUM];  
  9.  
  10. int prim()  
  11. {  
  12.     int v[MAX_VETEXT_NUM];//顶点集合  
  13.     int i,j,k,sum;  
  14.     sum = 0;  
  15.     k = 0;//初始点为'A'  
  16.     for (i = 0; i < MAX_VETEXT_NUM; ++i)  
  17.     {  
  18.         if (i != k)  
  19.         {  
  20.             closedge[i] = map[k][i];  
  21.             v[i] = 0;  
  22.         }  
  23.     }  
  24.     v[k] = 1;//'A'点并入集合中  
  25.     for (i = 1; i < MAX_VETEXT_NUM; ++i)  
  26.     {  
  27.         int min = numeric_limits<int>::max();  
  28.         //选择k  
  29.         for (j = 0; j < MAX_VETEXT_NUM; ++j)  
  30.         {  
  31.             if (!v[j] && (closedge[j] != 0) && (closedge[j] < min))  
  32.             {  
  33.                 min = closedge[j];  
  34.                 k = j;  
  35.             }  
  36.         }  
  37.         if (min == numeric_limits<int>::max())  
  38.         {  
  39.             break;  
  40.         }  
  41.         sum += min;  
  42.         v[k] = 1;//k个顶点并入集合  
  43.         //从k顶点出发有更短的边  
  44.         for (j = 0; j < MAX_VETEXT_NUM; ++j)  
  45.         {  
  46.             if (map[k][j] < closedge[j])  
  47.             {  
  48.                 closedge[j] = map[k][j];  
  49.             }  
  50.         }  
  51.     }  
  52.     return sum;  
  53. }  
  54. int main()  
  55. {  
  56.     int i,j;  
  57.     char chStart,chEnd;  
  58.     int nOutEdges,nValue;  
  59.     while (cin >> n && n != 0)  
  60.     {  
  61.         // 初始化图  
  62.         for( i = 0 ; i < n ; i++ )  
  63.         {  
  64.             for( j = 0 ; j < n ; j ++ )  
  65.             {  
  66.                 map[i][j] = map[j][i] = numeric_limits<int>::max() ;  
  67.             }  
  68.         }  
  69.         for (i = 0; i < n-1; ++i)  
  70.         {  
  71.             cin >> chStart >> nOutEdges;  
  72.             for (j = 0; j < nOutEdges; ++j)  
  73.             {  
  74.                 cin >> chEnd >> nValue;  
  75.                 map[chStart - 'A'][chEnd - 'A'] = nValue;  
  76.                 map[chEnd - 'A'][chStart - 'A'] = nValue;  
  77.             }  
  78.         }  
  79.         cout << prim() << endl;  
  80.     }  
  81.     return 0;