Prim算法(最小生成树)
Prim算法通过不断增加最近的点从而生成最小生成树;
该算法需要寻找最近的点,所有通过数组 dis[i][j] 来保存顶点i和顶点j之间的距离会比较方便;
Prim算法的重要一点是如何新增一个点 k 到生成树如何更新其他点到生成的距离:通过比较点j到生成树的距离 dis[j] 与 k 到 j 的距离 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; }