最小生成树(2)--Prim算法

之前写了最小生成树第一个Kruskal算法,Kruskal算法是根据边的长度来选择路径,然后生成最小生成树。现在说的Prim算法是根据顶点来选择连通路径,然后连成最小生成树。

Prim算法,按我的理解就是从任意一个顶点开始,选择一条它附近最短的边,就可以连接一个顶点,然后选择另一个顶点,找出离这树最近的一条边来连通。也就是说找这个要加入树的顶点和最小生成树的所有顶点中,最短的那一条边,就是我们要找的连接这条边和最小生成树的边。然后重复这个过程,直到把所有的顶点都加入这棵树,就算完成了最小生成树的寻求。

总结一下,图中的顶点可以分成两种,已经再树中的顶点我们暂且叫树顶点,未在树中的顶点叫非树顶点。首先,任意选择一个顶点加入生成树,为了加入树,需要列举出这个顶点到所有树顶点的距离,也就是边的权重值。然后找到这些中权值最小的那条边,作为连接这个要加入的顶点和树。重复n-1次,就找到了最小生成树。

在这个过程中,最麻烦的就是,怎么找到这个非顶点到树的所有边,这个我们可以借用最短路径的Dijksta算法,简单的来说就是用一个数组dis来记录非树顶点到树顶点的距离,每一次选择据树最近的那个顶点加入树,加入新的顶点到树中时,需要更新非树顶点到树的距离。

现在梳理一下具体实现流程:
1. 从任意一个顶点开始构造生成树,最初选择一个顶点,将这个顶点加入生成树,用book数组记录已经加入的顶点。
2. 用数组dis记录各顶点到树的距离,最初树中只有1号顶点,顶点有直接到树的距离就是1号顶点到顶点的边的权值,没有直连边的时候就是无穷大,就是初始化dis数组。
3. 从数组中找出离树最近的顶点加入到生成树中,加入树以后,更新生成树到没有个非树顶点的距离更新dis中的值。
4. 重复第3步,直到生成树中有n个顶点为止。

现在,具体的实现代码:

#include 
int main()
{
    int n,m,i,j,k,min,t1,t2,t3;
    int a[7][7],dis[7],book[7]={0};//对book数组进行初始化
    int inf=99999999;//表示无穷大的值,就是没连通
    int count=0,sum=0;//count用来记录生成树中顶点的个数,sum表示路径之和

    //读入n个顶点和m条边
    printf("Please input the numbers of Graph' vertex and edge divided by a space:\n");
    scanf("%d %d",&n,&m);

    //初始化
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j)
                a[i][j]=0;
            else
                a[i][j]=inf;

    //读入边
    printf("Please input the two vertexes and their edge divided by space.\n");
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&t1,&t2,&t3);
        a[t1][t2]=t3;
        a[t2][t1]=t3;
    }
    //初始化dis数组,1号顶点到各个顶点的距离
    for(i=1;i<=n;i++)
        dis[i]=a[1][i];

    //将1号顶点加入生成树
    book[1]=1;
    count++;
    while(countfor(i=1;i<=n;i++)
        {
            if(book[i]==0 && dis[i]1;
        count++;
        sum=sum+dis[j];
        //扫描当前顶点j所有的边,再以j为中间点,更新生成树到每一个非树顶点的距离
        for(k=1;k<=n;k++)
        {
            if(book[k]==0 && dis[k]>a[j][k])
                dis[k]=a[j][k];
        }
    }
    printf("The weight of all: %d",sum);//打印结果
    return 0;
}

结果:
最小生成树(2)--Prim算法_第1张图片

还可以借助“堆”,可以降低选边的时间复杂度,用邻接表来存储图可以降低时间复杂度。。。

你可能感兴趣的:(算法)