最小生成树prim算法示例程序

n,m表示顶点数和边数。

lowcost[]存放顶点集合T'内各顶点到顶点集合T内各顶点权值最小的边的权。

nearvex[]记录顶点集合T'内各顶点距离顶点集合T内那个顶点最近。nearvex[i]为-1时,表示顶点i属于集合T.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<cmath>
#include<map>
using namespace std;

const int INF=1000000;
const int maxn=21;
int n,m;
int edge[maxn][maxn];
int lowcost[maxn];
int nearvex[maxn];

void prim(int u)
{
    int sumw=0;
    for(int i=1;i<=n;i++)//初始化两个数组  
{ lowcost[i]
=edge[u][i]; nearvex[i]=u; } nearvex[u]=-1; for(int i=1;i<n;i++)//把剩余n-1个节点扩展进来
{ int min=INF; int v=-1; for(int j=1;j<=n;j++) if(nearvex[j]!=-1 && lowcost[j]<min) { v=j; min=lowcost[j]; } if(v!=-1)//没有找到权值最小的边 { printf("%d %d %d\n",nearvex[v],v,lowcost[v]); nearvex[v]=-1; sumw+=lowcost[v]; for(int j=1;j<=n;j++) if(nearvex[j]!=-1 && edge[v][j]<lowcost[j]) { lowcost[j]=edge[v][j]; nearvex[j]=v; } } } printf("weight of MST is %d\n",sumw); } int main() { int u,v,w; while(~scanf("%d%d",&n,&m)) { memset(edge,0,sizeof(edge)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); edge[u][v]=edge[v][u]=w; } for(int i=1;i<=n;i++)//对邻接矩阵中其他元素赋值 for(int j=1;j<=n;j++) { if(i!=j && edge[i][j]==0) edge[i][j]=INF; } prim(1);//从顶点1出发构造最小生成树 } return 0; }
原文地址:https://www.cnblogs.com/54zyq/p/3112028.html