#include<stdio.h>
#include<string.h>
#define inf 0x3f3f3f3f
#define N 1000+5
int g[N][N];
int vis[N];
int low[N];
int n,m;
int Prim()
{
int i,j,pos,res=0;
pos=1; //选取一个点作为初始点
vis[pos]=1;
for(i=1;i<=n;i++) //更新其他点到初始点的权值
{
if(i!=pos)
low[i]=g[pos][i];
}
for(i=1;i<n;i++) //n-1次循环将剩下的n-1个点加入生成树中
{
int min=inf;
for(j=1;j<=n;j++) //在未被访问过的点中寻找与已经访问过的点权值最小的点
{
if(!vis[j]&&min>low[j])
{
min=low[j];
pos=j;
}
}
vis[pos]=1;
res+=min;
for(j=1;j<=n;j++) //更新未访问的点与已经访问过的点间的最小权值
{
if(!vis[j]&&low[j]>g[pos][j])
low[j]=g[pos][j];
}
}
return res;
}
int main()
{
memset(g,inf,sizeof(g));
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
int s,e,w;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&s,&e,&w);
g[s][e]=g[e][s]=w;
}
int ans=Prim();
printf("%d",ans);
return 0;
}
无向图最小生成树Prim(普里姆)算法
最新推荐文章于 2025-05-14 16:02:26 发布