【kruskal算法】

 

kruskal算法

核心思想:

每次选择图中最小边权的边,如果边的两个端点不在同一个连通块中,则将这条边加入到最小生成树中。

伪代码:

int Kruskal()
{
    初始化已选的边数num=0,权值之和ans=0;
    初始化父结点为自身;
    给边按照权值从小到大排序;
    for(遍历所有的边)
    {
        找出这条边的两个端点结点;//用并查集的查找父结点功能实现
        if(这条边的两个端点在同一个连通块中)
        {
            把边加入到树中;//即合并父结点
            ans+=该边的权值;
            num++;
            if(num==结点数-1)//即已形成最小生成树
            break;
        }
            
    }
    if(num!=结点数-1)    //说明图不连通
        return -1;    
    return ans;
}

代码实现:

#include 
using namespace std;
const int MAXN=1000;
struct Edge
{
    int u,v;
    int w;  //边权
};
bool cmp(Edge a,Edge b)
{
    return a.w>edge[i].u>>edge[i].v>>edge[i].w;
    }
    for(int i=0;i

【kruskal算法】_第1张图片

 常用于稀疏图。

你可能感兴趣的:(算法笔记,算法,数据结构,图论)