zoukankan      html  css  js  c++  java
  • 最小生成树笔记

    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 */
  • 相关阅读:
    day14_oracle数据库备份
    day13_存储过程小记
    day13_先沃联盟定时任务
    day13_自动抽取数据——监控存储过程
    [笔记]《HTTP权威指南》- 实体和编码
    [笔记]《白帽子讲Web安全》- Web框架安全
    [笔记]《Vue移动开发实战技巧》- Vue-router使用
    WPF与Win32互操作
    [翻译]HTML5
    学习资料收藏
  • 原文地址:https://www.cnblogs.com/dcdcbigbig/p/8945130.html
Copyright © 2011-2022 走看看