笔记:克鲁斯卡尔算法(解决最小生成树问题)

//用到了并查集和堆排序解决最小生成树,思路就是权值边排序(堆排序),然后从最小权值边取起,边取边判定是否有回路(用并查集),有回路则放弃该边。思路相对简单,直接看代码。
#define MaxSize 100
typedef struct{
    int a,b;//边的两个顶点
    int weight;//边的权值
}Edge;//边结构体
int Find(int *parent,int x){
    while(parent[x]>=0) x=parent[x];//并查集知识点:循环向上寻找下标为x顶点的根
    return x;//返回根的下标
}
Edge edges[MaxEdge];//存储各条边
int parent[MaxVex];//并查集知识点:存储各顶点的父亲顶点
Void MiniSpanTree_Kruskai(MGraph G){
    int i,n,m;
    sort(edges);//这里的排序是经过重写的,按权值由小到大排序
    for(i=0;i<G.vexnum;i++) parent[i]=-1;//初始化,各个顶点单独形成一个集合
    for(i=0;i<G.arcnum;i++){//遍历每一条边
        n=Find(parent.edges[i].a);
        n=Find(parent.edges[i].b);
        if(n!=m){//根节点不同,则不会构成环
            parent[n]=m;
            print("(%d->%d)",edges[i].a,edges[i].b);//访问
        }    
    }
}

库鲁斯卡尔算法看起来简单,但用到了排序sort,因而时间耗费上取决边的多少,适合稀疏图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值