最小生成树笔记

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 */

猜你喜欢

转载自www.cnblogs.com/dcdcbigbig/p/8945130.html