最小生成树一般涉及两个算法:kruskal算法和prim算法
废话不多说直接上模板
kruskal算法
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=100000;
int f[maxn];
int n,m;
int tot=0,k=0;
struct node
{
int from,to,dis;
}e[maxn];
bool cmp(node a,node b)
{
return a.dis<b.dis;
}
int getf(int x)
{
if(f[x]==x)
return x;
return getf(f[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].dis);
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(k==n-1)
break;
int tx=getf(e[i].from);
int ty=getf(e[i].to);
if(tx!=ty)
{
f[ty]=tx;
tot+=e[i].dis;
k++;
}
}
printf("%d\n",tot);
return 0;
}
prim算法
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxx=500;
const int inf=0x3f3f3f3;
int d[maxx];
int vis[maxx];
int e[maxx][maxx];
int n,ans;
void prim(int x)
{
memset(vis,0,sizeof(vis));
int k,minn;
for(int i=0;i<n;i++)
{
minn=inf;
for(int j=0;j<n;j++)
{
if(!vis[j]&&d[j]<minn)
{
minn=d[j];
k=j;
}
}
vis[k]=1;
ans+=d[k];
for(int j=0;j<n;j++)
if(!vis[j]&&d[j]>e[j][k])
d[j]=e[j][k];
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&d[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&e[i][j]);
ans=0;
prim(0);
printf("%d\n",ans);
return 0;
}