Kruskal
1 //用并查集实现
2 #include<algorithm>
3 #include<iostream>
4 #include<cstring>
5 #include<cstdio>
6 #include<cmath>
7 using namespace std;
8 struct edge{
9 int u,v,w;
10 }a[10001];
11 bool cmp(edge e1,edge e2){
12 return e1.w<e2.w;
13 }
14 int fu,fv,n,m,u,v,w,tot=0,ans=0,fa[10001];
15 int ff(int u){
16 return fa[u]==u?fa[u]:ff(fa[u]);
17 }
18 void add(int u,int v,int w){
19 a[++tot].u=u;
20 a[tot].v=v;
21 a[tot].w=w;
22 }
23 int main(){
24 scanf("%d%d",&n,&m);
25 for(int i=1;i<=m;i++){
26 scanf("%d%d%d",&u,&v,&w);
27 add(u,v,w);
28 }
29 for(int i=1;i<=n;i++){
30 fa[i]=i;
31 }
32 sort(a+1,a+n+1,cmp);
33 for(int i=1;i<=m;i++){
34 fu=ff(a[i].u);
35 fv=ff(a[i].v);
36 if(fu!=fv){
37 ans+=a[i].w;
38 fa[fu]=fv;
39 }
40 }
41 printf("%d",ans);
42 return 0;
43 }
Prim
1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cmath>
5 int n,m,u,v,w,minn,minx,ans=0,map[1001][1001],mst[100001],lc[100001];
6 using namespace std;
7 void prim(){
8 for(int i=2;i<=n;i++){
9 lc[i]=map[1][i];
10 mst[i]=1;
11 }
12 mst[1]=0;
13 for(int i=2;i<=n;i++){
14 minn=2147483647;
15 for(int j=2;j<=n;j++){
16 if(lc[j]<minn&&lc[j]!=0){
17 minn=lc[j];
18 minx=j;
19 }
20 }
21 ans+=minn;
22 lc[minx]=0;
23 for(int j=2;j<=n;j++){
24 if(map[minx][j]<lc[j]){
25 lc[j]=map[minx][j];
26 mst[j]=minx;
27 }
28 }
29 }
30 }
31 int main(){
32 memset(map,0x7f,sizeof(map));
33 scanf("%d%d",&n,&m);
34 for(int i=1;i<=m;i++){
35 scanf("%d%d%d",&u,&v,&w);
36 map[u][v]=w;
37 map[v][u]=w;
38 }
39 prim();
40 printf("%d",ans);
41 return 0;
42 }
43 /*
44 6 10
45 1 2 6
46 1 3 1
47 1 4 5
48 2 3 5
49 2 5 3
50 3 4 5
51 3 5 6
52 3 6 4
53 4 6 2
54 5 6 6
55 */