Kruskal
#include<bits/stdc++.h>
using namespace std;
int f[9999];
struct qwe
{
int x,y,z;
} w[9999];
int find(int xx)
{
if(xx!=f[xx])
{
f[xx]=find(f[xx]);
}
return f[xx];
}
int cam(qwe h, qwe k)
{
return h.z<k.z;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
f[i]=i;
}
int tot=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int xx;
cin>>xx;
if(i<j)
{
tot++;
w[tot].x=i;
w[tot].y=j;
w[tot].z=xx;
}
}
}
sort(w+1,w+1+tot,cam);
int sum=0;
for(int i=1;i<=tot;i++)
{
if(f[find(w[i].x)]!=f[find(w[i].y)])
{
sum+=w[i].z;
f[find(w[i].x)]=f[find(w[i].y)];
}
}
cout<<sum<<endl;
return 0;
}
.Prim算法(普里姆算法)
Prim算法是通过每次添加一个新节点加入集合,直到所有点加入停止的 最小生成树的算法。
#include<bits/stdc++.h>
using namespace std;
int f[999][999],minn[99999];
int main()
{
int n;
cin>>n;
int tot=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int xx;
cin>>xx;
f[i][j]=xx;
}
}
for(int i=1;i<=n;i++)
{
minn[i]=1e9;
}
int p[999];
memset(p,false,sizeof§);
minn[1]=0;
for(int i=1;i<=n;i++)
{
int k=0,maxx=1e9;
for(int j=1;j<=n;j++)
{
if(maxx>minn[j]&&p[j]==false)
{
k=j;
maxx=minn[j];
}
}
p[k]=true;
for(int j=1;j<=n;j++)
{
if(p[j]==false&&minn[j]>f[k][j])
{
minn[j]=f[k][j];
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=minn[i];
}
cout<<sum<<endl;
return 0;
}