7-11 镖局运镖 (30 分)

镖局的运镖,就是运货(类似现在的物流)。镖局每到一个新地方开展业务,都需要对运镖途中的绿林好汉进行打点。好说话的打点费就比较低,不好说话的打点费就比较高。龙门镖局现在有一趟镖请你来规划路线,已知城市的地图,你需要选择一些道路进行疏通,以便镖局可以到达任意一个城市,要求花费的银子越少越好。

输入格式:

第一行有两个数n和m,n表示有n个城市(编号从1到n),m表示有m条道路。接下来m行,每行形如“a b c”用来表示一条道路,意思是城市a到城市b连通且打点需要花费的银子数是c。

输出格式:

若通过打点能抵达所有城市,则输出最少需要花费的银子总数。若不能抵达所有的城市则输出“impossible”。

输入样例:

3 3
1 2 1
1 3 2
2 3 4

输出样例:

3

题目大意:一个无向图有n个点,给你m条线段信息,表示两点之间的距离。现在求最小的路径总长度,将这n个点连成一个连通图,其实就是求最小生成树。

最小生成树有两种算法:Kruskal和Prim算法。两种方法求出来的结果一定都是最小生成树(最小生成树可能不唯一,但是最短总路径一定一样的),但是两种方法思路不一样,使用场合也不同。

Kruskal是不断地在找最小边,Prim是找距离生成树权值最小的点。Kruskal主要找边,Prim主要找点,这就决定了当边少的时候,就用Kruskal;当点少的时候,就用Prim。专业的说,Kruskal适合稀疏图,Prim适合稠密图。

(如果想达到最佳时间,其实应该两种方法都用,先判断一下给出的是稀疏图还是稠密图。忘了在哪里看到的)

Kruskal思想很简单,就是将边从小到大排序,从小的开始找,如果这条边的两个点不在一棵树上,那么将这两个点连接起来;如果两个点在一棵树上,跳过,继续找下一个边......重复进行,直到增加的边的数量达到n-1条。因为n个点的最小生成树的线段一定有n-1个边。

在判断是否是一棵树上的时候,用到了并查集。写这道题的时候,将Union函数中的f[a]=b写成了a=f[b],debug的时候还在奇怪我的并查集怎么没有用??还是对并查集理解不够熟练吧。

并查集的核心

int Find(int x)
{if(x==f[x]) return x;else return f[x]=Find(f[x]); //路径压缩
}void Union(int x,int y)
{int a=Find(x),b=Find(y);if(a!=b) f[a]=b;
}for(int i=1;i<=n;i++) //初始化f数组f[i]=i;

这道题可能搜不到,但是网上有很多题目描述不一样,但是实质是一样的题目。这题是天梯赛学校选拔时候出的,我当时学会了Dijstra算法,想着和Prim差不多,应该可以现场写出来(我对Prim和Kruskal仅限于理解含义,代码从没写过)。浪费了30分钟在这道题上,这次让我下定决心把图论学到扎实,做到遇到图论可以有思路,不浪费时间地解决问题。

#include <iostream>
#include <cstdio>
#include <algorithm>using namespace std;
const int Max = 1000010;int f[Max];
int n,m,x,y;int Find(int x)
{if(x==f[x]) return x;else return f[x]=Find(f[x]);
}void Union(int x,int y)
{int a=Find(x),b=Find(y);if(a!=b) f[a]=b;
}struct node
{int x,y,step;
};
node a[Max];bool cmp(node a,node b)
{return a.step<b.step;
}void kruskal()
{for(int i=1;i<=n;i++)//并查集f数组初始化f[i]=i;for(int i=0;i<m;i++){cin>>a[i].x>>a[i].y>>a[i].step;}sort(a,a+m,cmp);//按路径长度从小到大排序int sum=0,t=0;//sum为最小路径总和,t为已经添加了的路径条数for(int i=0;i<m;i++){if(t==n-1) break;//最小生成树的路径有n-1条if(Find(a[i].x)!=Find(a[i].y)) {sum +=a[i].step;Union(a[i].x,a[i].y);t++;}}if(t==n-1)cout<<sum<<endl;else cout<<"impossible";
}int main()
{cin>>n>>m;kruskal();return 0;
}

网上找的其他比较复杂的测试用例

6 10
1 2 16
1 6 21
1 5 19
2 3 5
2 4 6
2 6 11
3 4 6
6 4 14
5 4 18
5 6 33答案:56

镖局运镖(最小生成树 Kruskal)相关推荐

  1. 镖局运镖(kruskal算法)

    镖局的运镖,就是运货(类似现在的物流).镖局每到一个新地方开展业务,都需要对运镖途中的绿林好汉进行打点.好说话的打点费就比较低,不好说话的打点费就比较高.龙门镖局现在有一趟镖请你来规划路线,已知城市的 ...

  2. c语言编程镖局运镖,打点

    网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. IntersectionObserver是浏览器原生提供的构造函数: import'i ...

  3. hdu 1863(最小生成树kruskal)

    /*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cst ...

  4. 7-13 镖局运镖 (10 分)

    7-13 镖局运镖 (10 分) 镖局的运镖,就是运货(类似现在的物流).镖局每到一个新地方开展业务,都需要对运镖途中的绿林好汉进行打点.好说话的打点费就比较低,不好说话的打点费就比较高.龙门镖局现在 ...

  5. HDOJ 1863畅通工程(最小生成树kruskal算法并查集实现)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1863 最小生成树kruskal算法:http://www.zhuoda.org/irini/78592.h ...

  6. hdu 1162(最小生成树kruskal)

    /*Name: 最小生成树(kruskal) Author: Date: 10/04/12 19:17 */#include <math.h> #include <cstdio> ...

  7. 图的最小生成树-Kruskal算法

    问题引入 [问题描述] 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法. [输入形式] 输入图的顶点序列及图的边的情况.如样例所示.边的输入以输入-1,-1,-1作为结束 ...

  8. 【老生谈算法】matlab实现Kruskal避圈算法求最小生成树——Kruskal避圈算法

    基于MATLAB的Kruskal避圈算法求最小生成树 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于MATLAB的Kruskal避 ...

  9. 最小生成树kruskal算法

    最小生成树kruskal算法 概述 算法分析 代码 概述 克鲁斯卡尔(Kruskal)(Kruskal)(Kruskal)算法是求连通网的最小生成树的另一种方法.与普里姆(Prim)(Prim)(Pr ...

最新文章

  1. 如何生成表_SPSS简单操作 | 如何生成交叉表?
  2. vgh电压高了有什么_晶闸管如何调整交流电压!
  3. 解决PD17虚拟机安装时出现 “操作失败 执行该操作失败”的方法
  4. Notebook响应式扁平化后台UI框架模板
  5. jquery easyui 多选下拉框的实现
  6. Javascript第二章break和continue、二重循环及for和while的区别第五课
  7. wap_supplicant介绍
  8. origin数据平滑_Origin平滑曲线的使用方法
  9. 硬件知识学习整理:(上拉,下拉),(三极管),(OC,OD,推挽输出),(NMOS与PMOS),(MOSFET驱动电路),(IR2110S)
  10. 直线一级倒立摆数学建模与控制仿真
  11. 滴滴当年重创的安全事件,也会重创货拉拉吗?
  12. 标准差计算-python(有偏无偏)
  13. ObjectUtils.isEmpty() 和 null 区别
  14. 程序员的5个级别,你属于哪一个等级?
  15. python函数整理_python内置函数整理
  16. sql存储过程及应用
  17. ELK——企业级日志管理系统
  18. c语言malloc函数程序,c语言 malloc函数详解
  19. [转载] 查找光猫超级管理员密码方法
  20. 嵌入式GUI FTK设计与实现-主循环

热门文章

  1. 使用Time Machine连接到群晖 NAS时,该如何解决问题?
  2. 【Android Studio】退出app的弹框提示
  3. 趣谈《长空之王》中的航空知识-尾旋
  4. 北汽魔方的智能化解决方案让合资车羡慕
  5. 通过Python实现目标点经纬度的自动查询
  6. 湖南学计算机专业大专有哪些学校,湖南有哪些专科学校的计算机专业比较好啊...
  7. [Unity] 使用 Animation Rigging 制作瞄准 IK 1
  8. ROS机器人操作系统——创建工作空间与功能包(四)
  9. 哪些Mac电脑配备了Apple T2安全芯片,什么是T2芯片
  10. VMware仅主机模式下无法上网问题