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; }