转自大佬博客
int mp[505][505],vis[505]
int prim(int n)
{
int lowcost[505],sum=0;
for(int i=1;i<=n;i++)
lowcost[i]=mp[i][1];
vis[1]=1;
for(int i=1;i<=n;i++)
{
int mi=0x3f,j;
for(int k=1;k<=n;k++)
if(!vis[k] && mi>lowcost[k])
mi=lowcost[k],j=k;
vis[j]=1;
sum+=lowcost[j];
for(int k=1;k<=n;k++)
if(!vis[k] && lowcost[k]>mp[j][k])
lowcost[k]=mp[j][k];
}
return sum;
}
struct node
{
int u,v,w;
}e[50050];
int f[50050];
void init(void)
{
for(int i=1;i<=n;i++)
f[i]=i;
}
int fd(int x)
{
return f[x]==x?x:fd[x]=fd(f[x]);
}
int uion(int x,int y)
{
int fa=fd(x),fb=fd(y);
if(fa!=fb)f[fa]=fb;
}
bool cmp(node a,node b)
{
return a.w<b.w;
}
int kuskal(void)
{
sort(e,e+n);
int ans=0;
for(int i=0;i<m;i++)//m为边数
{
int u,v,fu,fv;
u=e[i].u;v=e[i].v;
fu=fd(u),fv=fd(v);
if(fu!=fv)
{
ans+=e[i].w;
uion(u,v);
}
}
return ans;
}