prim,适合稠密图,顶点少,边多(c语言)

本文介绍如何使用C语言实现Prim算法,该算法适用于处理顶点数量较少但边众多的稠密图。通过Prim算法,可以找到图中最小生成树,有效地连接各个顶点。

/*
 * 用prim算法弄最小生成树,每次一个点都会遍历所有点,找出,两点距离最短的情况
 * 再改变节点的入度和最小值
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY 1000
struct{
    int adjvex;
    int lowcost;
}closedge[31]; 
typedef struct {
    int vexnum;
    int arcs[11][11];
}AdjMatrix;
AdjMatrix *G;
void prim(AdjMatrix *G,int start);
int main()
{
    printf("请输入矩阵:");
    G = (AdjMatrix *)malloc(sizeof(AdjMatrix));
    for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)
                scanf(" %d",&(G->arcs[i][j]));

    G->vexnum = 10;
    int start = 10;
    prim(G,start);
    for(int i=1;i<=10;i++)
        printf("%d->%d\n",i,closedge[i].adjvex);
}
void prim(AdjMatrix *G,int start)
{
    int i,e,k,m=0,min=0;
    closedge[start].lowcost=0;

    for(int i=1;i<=G->vexnum;i++)//最开始是初始化
    {
        if(i!=start)
        {
            closedge[i].adjvex=start;
            closedge[i].lowcost=G->arcs[start][i];
        }
    }
    for(int i=1;i<=G->vexnum-1;i++)//大循环
    {
        min=INFINITY;
        for(int j=1;j<=G->vexnum;j++)
        //首先找到制定开始点到全部顶点最小的值
        {
            if(closedge[j].lowcost!=0&&closedge[j].lowcost<min)
            {
                m=j;
                min=closedge[j].lowcost;
            }
        }

        closedge[m].lowcost=0;//标志放入集合中
        for(int k=1;k<=G->vexnum;k++)
        //之后用找到最小边的顶点为开始,找出它到所有点最小权值
        {
            if(k!=m&&G->arcs[m][k]<closedge[k].lowcost)
            //点的任意一个最短
            {
                closedge[k].lowcost = G->arcs[m][k];
                closedge[k].adjvex = m;
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值