HDU1301 Jungle Roads(克鲁斯卡尔算法版)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301

通过对数组构造一个静态链表,将在同一个连通分量中的顶点链接起来。对按边权值从大到小排序后的边集合逐条进行判断,若边的起点和终点分别在不同的连通分量链表中(这通过获取其所在链表的表尾元素是否是同一个来进行判定),则此边加入最小生成树的边集合中,并将边的终点加入到边的起点所在的静态链表中。最终所有结点都会链接到一个静态链表中。

  
  
  
  
  1. #include<iostream> 
  2. #include<string> 
  3. #include<algorithm> 
  4. using namespace std ;  
  5.  
  6. const int MAX_VETEXT_NUM = 26;//最大的顶点数  
  7. const int MAX_EDGE_NUM = 75;//最大的边数  
  8.  
  9. struct Edge  
  10. {  
  11.     int begin;//起点  
  12.     int end;//结点  
  13.     double cost;//边的权值  
  14. };  
  15.  
  16. Edge edge[MAX_EDGE_NUM];//边集合  
  17. double sum = 0;  
  18. int ConnectedList[MAX_VETEXT_NUM];//连通分量静态链表  
  19. int nEdges; //边的数目  
  20. int nVetexs; //顶点数目  
  21.  
  22. int FindInConnectList( int Point[] , int v)  
  23. {//若v所在的连通分量静态链表为空,则返回参数v,否则返回其所在链表的表尾元素,  
  24.     int i = v ;  
  25.     while ( Point[i] > 0 )   
  26.         i = Point[i];  
  27.     return i ;  
  28. }  
  29.  
  30. bool cmp( const Edge& a , const Edge& b )  
  31. {//根据边权值从小到大排序  
  32.     return a.cost < b.cost ;  
  33. }  
  34.  
  35. void Kruscal()  
  36. {  
  37.     int i , j ;   
  38.     int v1 , v2 ;  
  39.     //初始化连通分量静态链表  
  40.     for ( i = 0 ; i < nVetexs ; i++ )  
  41.     {  
  42.         ConnectedList[i] = 0 ;  
  43.     }  
  44.     i = 0 ; j = 0 ;   
  45.     while ( j < nVetexs - 1 && i < nEdges )  
  46.     {  
  47.         v1 = FindInConnectList( ConnectedList , edge[i].begin) ;  
  48.         v2 = FindInConnectList( ConnectedList , edge[i].end) ;  
  49.  
  50.         if ( v1 != v2)  
  51.         {//起点和终点不在同一个连通分量重  
  52.             sum += edge[i].cost;  
  53.             ConnectedList[v1] = v2 ;//加入连通分量链表中  
  54.             ++j;//最小生成树边数加1  
  55.         }  
  56.         ++i;//处理完一条边  
  57.     }  
  58. }  
  59.  
  60. int main()  
  61. {  
  62.     int i , j ;  
  63.     int num ;  
  64.     double cost ;  
  65.     char chStart , chEnd;  
  66.     while ( cin >> nVetexs && nVetexs != 0)  
  67.     {  
  68.         sum = 0 ;   
  69.         nEdges = 0 ;  
  70.         for ( i = 0 ; i < nVetexs - 1 ; i ++ )  
  71.         {  
  72.             cin >> chStart >> num ;  
  73.             for( j = 0 ; j < num ; j ++ )  
  74.             {  
  75.                 cin >> chEnd >> cost ;  
  76.                 edge[nEdges].begin = chStart - 'A' ;  
  77.                 edge[nEdges].end = chEnd - 'A' ;  
  78.                 edge[nEdges].cost = cost ;  
  79.                 nEdges ++;  
  80.             }  
  81.         }  
  82.         sort(edge , edge + nEdges, cmp) ;  
  83.         Kruscal() ;  
  84.         cout << sum << endl ;     
  85.     }  
  86.     return 0 ;   

 

你可能感兴趣的:(职场,ACM,休闲)