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

 

 
    
  1. #include   
  2. #include   
  3. using namespace std;  
  4.  
  5. const int MAX_VETEX_NUM = 100;  
  6. int nPoints,nRoutes;//点的个数,边的个数  
  7. int route[MAX_VETEX_NUM][MAX_VETEX_NUM]; //图  
  8. int closedge[MAX_VETEX_NUM];  
  9.  
  10. int prim()  
  11. {//普里姆算法求最小生成树  
  12.     int i,j,sum = 0;  
  13.     int v[MAX_VETEX_NUM];//选择的顶点集  
  14.     int k = 1;//初始点为号顶点  
  15.     for(i = 1;i <= nPoints; ++i)  
  16.     {  
  17.         if (i != k)  
  18.         {  
  19.             closedge[i] = route[1][i];  
  20.             v[i] = 0;  
  21.         }  
  22.     }  
  23.     v[k] = 1;//1号点并入顶点集  
  24.     for(i = 1;i <= nPoints; ++i)  
  25.     {  
  26.         int min = numeric_limits<int>::max();  
  27.         //选当前顶点集中顶点到其他顶点的最短边  
  28.         for(j = 1;j <= nPoints; ++j)  
  29.         {  
  30.             if(!v[j] && closedge[j] && (closedge[j] < min))  
  31.             {//还没并入过顶点集,有到顶点集中顶点的边  
  32.                 min = closedge[j];  
  33.                 k = j;  
  34.             }  
  35.         }  
  36.         if(min != numeric_limits<int>::max())  
  37.             sum += min;  
  38.         v[k] = 1;//第k顶点并入顶点集  
  39.         //从k顶点出发有更短边,  
  40.         for(j=1;j<=nPoints;j++)  
  41.         {  
  42.             if(!v[j] && route[k][j] &&((route[k][j] < closedge[j]) || closedge[j]==0))  
  43.             {  
  44.                 closedge[j] = route[k][j];  
  45.             }  
  46.         }  
  47.     }  
  48.     return sum;  
  49. }  
  50. int main()  
  51. {  
  52.     int i,p1,p2,nCost;  
  53.     while(cin >> nPoints && nPoints != 0)  
  54.     {  
  55.         cin >> nRoutes;  
  56.         if(nRoutes == 0)  
  57.         {  
  58.             cout << 0 << endl;  
  59.         }  
  60.         else 
  61.         {  
  62.             memset(route,0,sizeof(route));  
  63.             for(i = 1;i <= nRoutes; ++i)  
  64.             {  
  65.                 cin >> p1 >> p2 >> nCost;  
  66.                 if(route[p1][p2] != 0)  
  67.                 {  
  68.                     if (nCost < route[p1][p2])  
  69.                     {  
  70.                         route[p1][p2] = route[p2][p1] = nCost;  
  71.                     }  
  72.                 }  
  73.                 else 
  74.                 {  
  75.                     route[p1][p2] = route[p2][p1] = nCost;  
  76.                 }  
  77.             }  
  78.             cout << prim() << endl;  
  79.         }  
  80.     }  
  81.     return 0;