zoukankan      html  css  js  c++  java
  • [笔记]: 最小生成树Kruska 2017-06-05 16:52 34人阅读 评论(0) 收藏

    转自:http://blog.csdn.net/lulipeng_cpp/article/details/7800865

    kruskal算法的精髓在于:

    每次选取一条边。

    该边同时满足:1、在当前未选边中权值最小;2、与已选边不构成回路。

    直到选取n-1条表是算法结束。找到MST活判断不存在MST。

     

    代码设计:

    1、利用优先级队列将权值小的边放到队列最前,优先出对,保证了每次选择的都是权值最小的边。

    2、利用并查集的查找及结合把同处同一连通分量中的顶点连到同一父节点下。这样,每次判断是

    否构成回路,只要判断父节点是否相同的即可。

     

    代码:

    1. #include<iostream>  
    2. #include<cmath>  
    3. #include<queue>  
    4. using namespace std;  
    5.   
    6. const int maxn=101;  //图的最大节点数   
    7.   
    8. struct edge  //边   
    9. {  
    10.     int from;  //起点   
    11.     int to;    //终点   
    12.     int cost;  //路径长   
    13.       
    14.     friend bool operator < (const edge &e1,const edge &e2)  
    15.     {  
    16.         return e1.cost>e2.cost;  
    17.     }  
    18. };  
    19.   
    20. edge remMST[maxn];   //记录组成最小生成树的边    
    21. int father[maxn];    //用来做并查集   
    22. int nodeNum,edgeNum;  //顶点数、边数   
    23. int MST;                //最小生成树   
    24. priority_queue<edge> myQ;   //kruskal算法,存放边   
    25.   
    26. void storeMap()   //存储岛的桥构成的图   
    27. {  
    28.     while(!myQ.empty()) myQ.pop();  //清空   
    29.       
    30.     int  from,to,cost;  
    31.     for(int i=0;i<edgeNum;i++)    //kruskal算法对于无向图也只需建一条边即可   
    32.     {  
    33.         scanf("%d%d%d",&from,&to,&cost);  
    34.   
    35.         edge e;  
    36.         e.from=from;  
    37.         e.to=to;  
    38.         e.cost=cost;  
    39.               
    40.         myQ.push(e);  
    41.     }  
    42. }     
    43.    
    44. int find(int x)  //查找   
    45. {  
    46.     if(x==father[x]) return father[x];  
    47.     return father[x]=find(father[x]);  
    48. }  
    49.   
    50. bool judge()   //判断是否是一棵最小生成树 ,这里得注意起点和终点   
    51. {  
    52.     int f=find(1);  
    53.       
    54.     for(int i=2;i<=nodeNum;i++)  
    55.     {  
    56.         if(f!=find(i))  
    57.         {  
    58.             return false;  
    59.         }  
    60.     }  
    61.       
    62.     return true;  
    63. }  
    64.   
    65. void kruskal()   //kruskal算法   
    66. {  
    67.     MST=0;  
    68.       
    69.     for(int i=0;i<maxn;i++)  
    70.     {  
    71.         father[i]=i;  
    72.     }  
    73.       
    74.     int num=0;   //记录MST的边数   
    75.     while(!myQ.empty() && num!=nodeNum-1)  
    76.     {  
    77.         edge e=myQ.top();  
    78.         myQ.pop();  
    79.           
    80.         int fx=find(e.from);  
    81.         int fy=find(e.to);  
    82.           
    83.         if(fx!=fy)  
    84.         {  
    85.             father[fx]=fy;  
    86.             MST+=e.cost;  
    87.               
    88.             remMST[num].from=e.from;  
    89.             remMST[num].to=e.to;  
    90.             remMST[num].cost=e.cost;  
    91.                
    92.             num++;  
    93.         }  
    94.     }  
    95. }         
    96.   
    97. void output()   //打印最小生成树的值以及由哪些边组成   
    98. {  
    99.     if(judge())  
    100.     {  
    101.         printf("from <-> to  cost: ");   
    102.         for(int i=0;i<nodeNum-1;i++)  
    103.         {  
    104.             printf("%d %d %d ",remMST[i].from,remMST[i].to,remMST[i].cost);  
    105.         }   
    106.         printf("MST Is : %d ",MST);  
    107.     }   
    108.     else printf("No MST Exist! ");   
    109. }  
    110.                     
    111. int main()  
    112. {  
    113.     while(scanf("%d%d",&nodeNum,&edgeNum)!=EOF)   
    114.     {  
    115.         storeMap();  
    116.            
    117.         kruskal();  
    118.           
    119.         output();   
    120.     }  
    121.       
    122.     system("pause");  
    123.     return 0;  
    124. }          
  • 相关阅读:
    数字全排列
    Nginx与HAProxy的区别
    Ceph RBD 的实现原理与常规操作
    pxc挂了一个节点怎么办
    AWTK javascript绑定原理
    雷电网络更新:迈向 Ithaca
    Chorus.one:Loom Network 项目前景 & 质押收益
    隐密交易的到来:深入 AZTEC 协议
    技术开发中一些名词解释
    技术开发中一些名词解释
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183627.html
Copyright © 2011-2022 走看看