您的位置:首页 > 其它

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

2013-06-01 12:52 405 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: