Prim
#include<cstdio>
#define MAXN 5005
#define MAXM 200005
using namespace std;
struct edge{
int u,v,w,next;
}G[MAXM<<1];
int head[MAXN];
int vis[MAXN];
int dis[MAXN];
int N,M,tot=0;
inline void add(int u,int v,int w){
G[++tot].u=u;G[tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot;
}
int main(){
scanf("%d%d",&N,&M);
int u,v,w;
for(register int i=1;i<=M;++i){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
int ans = 0;
vis[1]=1;
int root = 1;
for(register int i=1;i<=N;++i)dis[i]=2147483647;
for(register int i=1;i<N;++i){
for(register int j=head[root];j;j=G[j].next){
if(G[j].w<dis[G[j].v])dis[G[j].v] = G[j].w;
}
int minn = 2147483637;
for(register int j=1;j<=N;++j){
if(vis[j]==0&&dis[j]<minn){
minn=dis[j];
root=j;
}
}
ans+=dis[root];
vis[root]=1;
}
printf("%d",ans);
return 0;
}
Kruscal
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=200005;
int fa[5005],u[maxn],v[maxn],w[maxn];
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y){
int xx=find(x),yy=find(y);
if(xx!=yy)fa[xx]=yy;
}
inline void qs(int l,int r){
int i=l,j=r,s=w[(l+r)/2];
do{
while(w[i]<s)i++;
while(w[j]>s)j--;
if(i<=j){
swap(u[i],u[j]);
swap(v[i],v[j]);
swap(w[i],w[j]);
i++;
j--;
}
}while(i<j);
if(i<r)qs(i,r);
if(l<j)qs(l,j);
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)scanf("%d%d%d\n",&u[i],&v[i],&w[i]);
qs(1,m);
int cnt=0,ans=0;
for(int i=1;i<=m;i++){
if(find(u[i])!=find(v[i])){
merge(u[i],v[i]);
ans+=w[i];
cnt++;
}
if(cnt==n-1)break;
}
printf("%d\n",ans);
return 0;
}