• 最小生成树笔记


    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 */
  • 相关阅读:
    zoj3299 Fall the Brick
    hdu4533 威威猫系列故事——晒被子
    FZU 1650 1752 a^b mod c
    Codeforces Round #136 (Div. 1) B. Little Elephant and Array
    Codeforces Round #292 (Div. 1) C. Drazil and Park
    Uva 12436 Rip Van Winkle's Code
    Codeforces Beta Round #19 D. Points
    hdu1513 Palindrome
    poj1160 Post Office
    zjnu1181 石子合并【基础算法・动态规划】——高级
  • 原文地址:https://www.cnblogs.com/dcdcbigbig/p/8945130.html
Copyright © 2020-2023  润新知