生成树是一个连通图的生成树是该联通图的一个极小联通子图,含有图的全部顶点。 最小生成树是在生成树的基础上要求树的(n-1)条边的权值之和是最小的。
要求: 必须是该图中的边、无回路、n-1个边连n个顶点、这n-1个边上的权值之和是最小。、
int prim(int n)
{
//第一个点到其他点的距离
for(int i=1;i<=n;i++)
{
dis[i]=mp[1][i];
}
vis[1]=1;
//还剩n-1个点
int x=n-1;
while(x--)
{
int mi=INF;
int v=-1;
//找下一个到源点的最短路的点 记录其为v
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]<mi)
{
mi=dis[i]; v=i;
}
}
//ans记录最小权值和
ans+=dis[v];
// cout<<v<<endl;
vis[v]=1;// 标记走过
//更新dis的值 "源点"变了 变成v了
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]>mp[v][i])
{
dis[i]=mp[v][i]; //以v为源点
}
}
}
return ans;
}