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

Posted fate-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[啊哈算法]镖局运镖(最小生成树)相关的知识,希望对你有一定的参考价值。

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 } 

 




以上是关于[啊哈算法]镖局运镖(最小生成树)的主要内容,如果未能解决你的问题,请参考以下文章

图灵算法群《啊哈算法》领读

最小生成树matlab代码Kruskal算法,用于二维网络生成

最小生成树matlab代码Kruskal算法,用于二维网络生成

最小生成树详解 prim+ kruskal代码模板

最小生成树及Prim算法及Kruskal算法的代码实现

图的最小生成树算法(图解+代码)| 学不会来看我系列