kruskal模板:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
 
const int MAXN=10000;
const int MAXM=10000;
struct edge
{
    int u,v,w;
}e[MAXM];
 
bool cmp(edge a,edge b)  //重要! 
{
    if(a.w<b.w)
        return true;
    else
        return false;
}
//并查集(确定有无回路
int father[MAXN];
int get(int a)
{
    if(father[a]==a)
        return a;
    return father[a]=get(father[a]);
}
 
void merge(int a,int b)
{
    a=get(a);
    b=get(b);
    if(a!=b)
        father[a]=b;
}
 
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    sort(e+1,e+m+1,cmp);   //把边按边权排序! 
    for(int i=1;i<=n;i++)
        father[i]=i;
    int res=0; //记录添加到最小生成树中的边数(最终=n-1即可 !!! 
    int ans=0; //记录边权值和
    for(int i=1;i<=m && res<n-1;i++)
    {
        int u=e[i].u;
        int v=e[i].v;
        if(get(u)==get(v)) //若产生回路,不加这条边 
            continue;
        else //否则加这条边 
        {
            res++; //记录最小生成树中的边数 
            merge(u,v);
            ans+=e[i].w;
        }
    }
    cout<<ans;
    return 0;
}

prim算法模板

/*
*  数组tree[]用来记录最小生成树的节点
*  数组lowdis[]记录从起点到其余所有点的距离并不断更新
*  数组map[][]记录所有数据两点之间的距离
*  point是所有节点的数目,begin是起点
*  mindis是最小生成树的长度
*/
void prime()
{
    int i,j,min,mindis=0,next;
    memset(tree,0,sizeof(tree));
    for(i=1;i<=point;i++)
    {
        lowdis[i]=map[begin][i];//用lowdis[]数组记录下从起点到剩下所有点的距离
    }
    tree[begin]=1;//标记起点(即最小生成树中的点)
    for(i=1;i<point;i++)
    {
        min=INF;
        for(j=1;j<=point;j++)
        {
            if(!tree[j]&&min>lowdis[j])
            {
                min=lowdis[j];//求出从当前起点到其余所有点的距离中最短的
                next=j;
            }
        }
        mindis+=min;//记录下整条最小树的长度
        tree[next]=1;
        for(j=1;j<=point;j++)
        {
            if(!tree[j]&&lowdis[j]>map[next][j])
            lowdis[j]=map[next][j];//更新lowdis[]数组
        }
    }
    printf("%d\n",mindis);
}