prim算法

void Prim(Graph g,int v0,int &sum)
{
    int lowcost[maxsize],vset[maxsize];//lowcost数组表示当前生成树到某一节点的最短长度;vset表示此顶点是否已经加入到生成树中
    int i,k,j,p,min;
    //6-13行为初始化,主要做的有将起始顶点添加到生成树中去,并补全当前生成树下的lowcost值,由于起始顶点已经加入到了生成树中去,那么这个顶点的vset值则为1,sum用来记录当前生成树的权值,j指向最后一个加入到生成树中的顶点
    for(i=0;i<g.n;i++)
    {
        lowcost[i]=g.edges[v0][i];
        vset[i]=0;
    }
    sum=0;
    j=v0;
    vset[v0]=1;
    for(k=0;k<g.n-1;k++)//因为起始顶点已经加入到了生成树中去,那么现在就只需要将余下的n-1个顶点加入即可
    {//16-23行是找与当前生成树之间组成的边的权值最小的顶点
        min=INF;//min初始化
        for(p=0;p<g.n;p++)//对所有顶点进行遍历查找
        {
            if(vset[p]==0&&lowcost[p]<min)//当某一个顶点满足未被加入到生成树中且它的lowcost值比当前的min还小则更新min以及j的指向(j始终指向最后一个加入生成树的顶点)
            {
                min=lowcost[p];
                j=p;
            }
        }
        //待此循环结束后则找到了下一个该被加入到生成树中的顶点,此时j已经指向它了,并且min也是最小权值了
        sum+=min;//累加权值
        vset[j]=1;//表示这个顶点已经加入到生成树中了
        for(p=0;p<g.n;p++)//28-34行则是由于生成树中新加入了一个新顶点可能会导致原有的lowcost值发生改变,这几行的功能就是更新lowcost值,假如原来lowcost[3]=∞,现在由于新顶点的加入,使得lowcost[3]=5,那么就需要更新它,而这个新顶点刚好是由j指向的,所以就依次检查即可。
        {
            if(g.edges[j][p]<lowcost[p]&&vset[p]==0)//已经存在于生成树中的顶点要排除掉,因为可能会构成环
            {
                lowcost[p]=g.edgs[j][p];
            }
        }
    }
}
Prim算法是一种贪心算法,用于求解加权无向图的最小生成树。从一个节点开始,每次选择一个与当前生成树相邻的最小边,加入生成树中,直到所有节点都被加入生成树。下面是Prim算法的伪代码: ``` 1. 选取一个起始节点u 2. 标记节点u为已访问 3. for v in u的邻居节点: 4. 将(u,v)加入候选边集合中 5. while 候选边集合不为空: 6. 从候选边集合中选择一条最小边(u,v),将v标记为已访问 7. 将(u,v)加入生成树中 8. for w in v的邻居节点: 9. 如果w未被访问过,将(v,w)加入候选边集合中 ``` 下面是一个示例代码,使用邻接矩阵来表示图: ```python import sys def prim(graph): n = len(graph) # 初始化 visited = [False] * n dist = [sys.maxsize] * n parent = [-1] * n dist[0] = 0 for i in range(n): # 找到未访问过的最近的节点 u = -1 for j in range(n): if not visited[j] and (u == -1 or dist[j] < dist[u]): u = j # 标记为已访问 visited[u] = True # 更新与节点u相邻的节点的距离 for v in range(n): if not visited[v] and graph[u][v] != 0 and graph[u][v] < dist[v]: dist[v] = graph[u][v] parent[v] = u return parent # 示例代码 if __name__ == '__main__': graph = [ [0, 2, 0, 6, 0], [2, 0, 3, 8, 5], [0, 3, 0, 0, 7], [6, 8, 0, 0, 9], [0, 5, 7, 9, 0] ] parent = prim(graph) for i in range(1, len(parent)): print("{}-{}".format(parent[i], i)) ``` 输出结果为: ``` 0-1 1-2 0-3 1-4 ``` 其中,输出的每一行表示生成树中的一条边,如“0-1”表示0和1之间有一条边。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值