最小生成树之克鲁斯卡尔(Kruskal)算法

最小生成树之克鲁斯卡尔(Kruskal)算法

最小生成树之克鲁斯卡尔(Kruskal)算法_第1张图片

算法描述:克鲁斯卡尔算法需要对图的边进行访问,所以克鲁斯卡尔算法的时间复杂度只和边又关系,可以证明其时间复杂度为O(eloge)。
算法过程:
1.将图各边按照权值进行排序
2.将图遍历一次,找出权值最小的边,(条件:此次找出的边不能和已加入最小生成树集合的边构成环),若符合条件,则加入最小生成树的集合中。不符合条件则继续遍历图,寻找下一个最小权值的边。
3.递归重复步骤1,直到找出n-1条边为止(设图有n个结点,则最小生成树的边数应为n-1条),算法结束。得到的就是此图的最小生成树。
克鲁斯卡尔(Kruskal)算法因为只与边相关,则适合求稀疏图的最小生成树。而prime算法因为只与顶点有关,所以适合求稠密图的最小生成树。

#define MAX 5000
int father[MAX],rank1[MAX];
int edgenum;//总的边数
struct Kruskal //存储边的信息
{
    int a;
    int b;
    int value;
};
Kruskal edge[MAX];
bool cmp( Kruskal o1,Kruskal o2)
{
    return o1.value < o2.value;
}
int find_set(int x)//查找x元素所在的集合,回溯时压缩路径
{
    if(x!=father[x])
        father[x]=find_set(father[x]);
    return father[x];
}
    //bool为布尔型,结果要么对,要么错
bool union_set(int x,int y)//合并
{
    x=find_set(x);
    y=find_set(y);
    if(x==y) return false;//判断是否为环
    else if(rank1[x]>rank1[y])
    {
        father[y]=x;
    }
    else
    {
        if(rank1[x]==rank1[y])
            rank1[y]++;
        father[x]=y;
    }
    return true;
}



你可能感兴趣的:(最小生成树)