prim算法
和dijkstra算法有点类似,不过dijkstra算法在找寻最小路径是是找到已能到达点中最小的点,然后将然后以该点为中转站对路径进行更新,而prim算法是将已找到的点看作一个集合,然后再找到离这个集合最短的点,将这个点纳入这个集合,重复上述操作
#include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
const int N=10000;
int mp[N][N];
int f[N];//存储父节点
int d[N];//到生成树的最短距离
int vis[N];//标记是否已被找到
int n,m;
void prim()
{
for(int i=1; i<=n; i++)
{
if(mp[1][i]!=inf)
f[i]=1;
d[i]=mp[1][i];
}
while(true)
{
int Min=inf;
int t=-1;
for(int i=1; i<=n; i++)
{
if(vis[i]==0&&d[i]<Min)
{
Min=d[i];
t=i;
}
}
if(t==-1)
break;
vis[t]=1;
for(int i=1; i<=n; i++)
{
if(vis[i]==0&&d[i]>mp[t][i])
{
d[i]=mp[t][i];
f[i]=t;
}
}
}
int sum=0;
for (int i=1; i<=n; i++)
if(f[i]==-1)
{
printf("不存在最小生成树\n");
return ;
}
else
sum+=d[i];
printf("最短生成树的长度为%d\n",sum);
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=inf;
}
}
memset(vis,0,sizeof(vis));
memset(f,-1,sizeof(f));
int a,b,c;
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
mp[a][b]=c;
mp[b][a]=c;
}
prim();
}