简单明了的普利姆算法

普利姆思想:先选中一个结点为一个整体,在剩下所有结点与该整体的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,然后在新合成的整体与剩下的所有结点的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,以此类推,直到所有结点遍历完。

举个实例,首先这是一个初始图表,如下所示:

这里写图片描述
第一步:我们先随机找一个基本点(例如1),然后分别列出该点到各边的距离,如下:
这里写图片描述
然后在上图中提出边长最短的一条1–>2,接下来以(1,2)为一个基本查找点,列出所有与(1,2)相关的边。
这里写图片描述
接下来,在边长为2,3,5,6间找出边长最短的边2,对应(1,3)两顶点,即将顶点3归入(1,2)内,然后(1,2,3)就变成了一个整体
这里写图片描述
最后,在边长为5,6,+&间找出最短的边5,对应(1,4)两顶点,将顶点4归入(1,2,3)中得到(1,2,3,4),即所有的点遍历完全,算法结束。

接下来代码代码演示

int visit[max];
int road[max];
int cog[max];
int j;
typedef struct AG
{
    int g[maxize][maxsize] //存储两个顶点及其相应的边长
    int n;     //存储图的结点总数
    int d;     //存储图的边数
}AG;
void MG(AG a,int i){
    int u;
    for(u=0;u<a.n,u++)
    {
        visit[u]=0; //将每个结点做好唯一标志
    }
    for(u=1;u<=a.d;u++)
    {
        if(i!=u)
        cog[u]=a.g[i][u];//先把这个点与各个点连接的距离记下来
    }
    j=0;
    visit[i]=1;road[j]=i;
    while(j!=a.n-1)
    {
    for(k=0;k<a.n;k++)
        if(visit[k]==0)
        {
            if(a.g[j][k]<cog[k])//重新将剩余各点最小的点进行排序
            cog[k]=a.g[j][k];
            if(term>cog[k])  //取剩下边中最小的一条边
            {
                term=cog[k];
                z=k;
            }
        }
        visit[z]=1;
        term=N;
        road[++j]=z;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42373888/article/details/81435653