• [啊哈算法]镖局运镖(最小生成树)


    Description

    最近小哼迷上了《龙门镖局》,从恰克图道武夷山,从张家口道老河口,从迪化道佛山,从蒙自道奉天......古代镖局的运镖,也就是现在的物流。镖局每到一个地方开展业务,都需要堆运镖途中的绿林好汉进行打点(不给钱就不让过路)。好说话的打点费就比较低,不好说话的打点费就比较高。城镇类似如下,顶点是城镇编号,边上的值表示这条道路上打点绿林好汉需要的银子数。

    请你帮镖局算算,如果从1号城镇出发,遍历每个城镇最少需要准备多少打点银子?

    Input

    输入第一行包括两个正整数n,m。n代表城镇个数,m表示道路个数(1 < n,m < 100)。

    后面的m行分别包含三个正整数a,b,c,表示在从城镇a 到 城镇b的道路上需要交纳的银子数。

    
    

    Output

    输出从1号城镇出发,遍历每个城镇最少需要准备的银子数。

    Sample Input

    6 9
    2 4 11
    3 5 13
    4 6 3
    5 6 4
    2 3 6
    4 5 7
    1 2 1
    3 4 9
    1 3 2
    

    Sample Output

    19

    这是kruskal算法

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 struct edge{//用结构体来存储边的信息 
     5     int u;
     6     int v;
     7     int w;
     8 };
     9 int n,m;
    10 int f[103];
    11 int num=0,sum=0;//num表示边的数量,sum表示最小生成树的总权 
    12 int cmp(edge x,edge y){//自定义排序方式 
    13     return x.w<y.w;
    14 }
    15 int getf(int x){//找祖宗的函数 
    16     if(f[x]==x)
    17         return x;
    18     else{
    19         f[x]=getf(f[x]);
    20         return f[x];
    21     }    
    22 }
    23 int merge(int x,int y){//合并两个集合 
    24     int t1=getf(x);
    25     int t2=getf(y);
    26     if(t1!=t2){
    27         f[t2]=t1;
    28         return 1;
    29     }
    30     return 0;
    31 }
    32 int main(){
    33     struct edge e[103];
    34     cin>>n>>m;
    35     for(int i=1;i<=m;i++){
    36         cin>>e[i].u>>e[i].v>>e[i].w;
    37     }
    38     for(int i=1;i<=n;i++){
    39         f[i]=i;
    40     }
    41     sort(e+1,e+m+1,cmp);//stl排序 
    42     for(int i=1;i<=m;i++){//核心语句:先遍历每条边 
    43         if(merge(e[i].u,e[i].v)){//如果这两个点没有相通 
    44             num++;//增加最小生成树的一条边 
    45             sum+=e[i].w;//总权值增加 
    46         }
    47         if(num==n-1){//最小生成树共有n-1条边 
    48             break;
    49         }
    50     }
    51     cout<<sum;
    52     return 0;
    53 } 



  • 相关阅读:
    Android LBS系列06 位置策略(二)模拟位置数据的方法
    Android LBS系列03 Geocoder类与地址显示
    Java 容器集合框架概览
    Android 按钮类控件大集锦:Button ToggleButton CheckBox RadioButton
    Java中的包与导入
    《Head First设计模式》 读书笔记01 策略模式
    Android Fragment和Activity
    Java中的final
    《Head First设计模式》 读书笔记07 封装调用:命令模式
    Google Maps Android API V2的使用及问题解决
  • 原文地址:https://www.cnblogs.com/fate-/p/12248540.html
Copyright © 2020-2023  润新知