PRIM算法构造最小生成树
1.问题描述
假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一颗包含边(u,v)的最小生成树。
2.prim算法的计算过程
重复执行下述操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0 并入U,直至U=V为止。
此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
3.图像表示
4.代码实现
int prim()
{
fill(d,d+maxSize,INF);
d[0]=0;
int ans=0;
for(int i=0;i<n;i++)
{
int u=-1;
int min=INF;
for(int j=0;j<n;j++)
{
if(vis[j]==false&&d[j]<min)
{
u=j;
min=d[j];
}
}
if(u==-1)
return -1;
vis[u]=true;
ans+=d[u];
for(int v=0;v<n;v++)
{
if(vis[v]==false&&G[u][v]!=INF&&G[u][v]<d[v])
d[v]=G[u][v];
}
}
return ans;
}
5.源代码
https://github.com/adamlallana77/-/blob/master/prim%E7%AE%97%E6%B3%95.cpp