Prim算法(最小生成树)

Prim算法通过不断增加最近的点从而生成最小生成树;

该算法需要寻找最近的点,所有通过数组 dis[i][j] 来保存顶点i和顶点j之间的距离会比较方便;

Prim算法的重要一点是如何新增一个点 到生成树如何更新其他点到生成的距离:通过比较点j到生成树的距离 dis[j] kj 的距离 edge[k][j] 的大小 ,如果edge[k][j] 小,则将 dis[j] 更新为 edge[k][j] 。

代码:

#include <string.h>
#include<iostream>
#include<vector>
#include<queue>
#include <algorithm>
#define INF 1<<30
using namespace std;
int book[100];//标记顶点是否加入最短生成树
int edge[100][100];//储存边
int dis[100];//每个顶点到最小生成树的距离
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<=n;i++){//初始化所有边
        for(int j=0;j<=n;j++){
            if(i==j) edge[i][j]=0;
            else edge[i][j]=INF;
        }
    }
    int s,t,w;
    for(int i=0;i<m;i++){//输入边信息
        cin>>s>>t>>w;
        edge[s][t]=w;//无向图所以需要存两条边
        edge[t][s]=w;
    }
    for(int i=1;i<=n;i++){//初始化所有顶点到仅有源点的最小生成树的距离
        dis[i]=edge[1][i];
    }
    for(int i=0;i<=n;i++){
        book[i]=0;
    }
    book[1]=1;
    int munber=0,sum=0,j,min;
    while(munber<n){
        min=INF;
        for(int i=1;i<=n;i++){//寻找距离生成树最近的点
            if(book[i]==0&&dis[i]<min){
                min=dis[i];
                j=i;
            }
        }
        sum+=dis[j];//将最近的点加入生成树
        book[j]=1;
        munber++;
        for(int i=1;i<=n;i++){//更新所有点到生成树的距离
            if(dis[i]>edge[j][i])
                dis[i]=edge[j][i];
        }
    }
    cout<<sum<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/zdl2234/p/10367655.html