当前位置: 首页 > news >正文

导游问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Description

Mr. G. 在孟加拉国的一家旅游公司工作。他当前的任务是带一些游客去一些遥远的城市。和所有国家一样,一些城市之间有双向道路。每对相邻城市之间都有一条公交路 线,每条路线都规定了自己的最大乘客数目。Mr. G. 有一份包含城市间道路状况和公交车最大载客量的地图。往往无法一次性地将所有乘客带往目的地。例如,在下面7个城市的地图中,边代表道路,每条边上的数字代表这条道路上公交车的最大载客量。如果Mr. G. 要将99位乘客从城市1带到城市7,则至少要往返5次(他必须陪同每一群乘客)。最佳路线是1-2-4-7

06002321_sJn1.jpg

Input

第 一行为一个整数t,表示测试用例个数。 每组数据的第一行有两个整数N(N100)R(R4950),分别表示城市的数量和道路的数量。接下来的R行每行有3个整数(C1,C2,P),其 中C1C2为城市编号,P(1<P<10000)是该道路上公交车的最大载客量。各城市编号为1~N的连续整数。第R+1行包含3个整数 (S,D,T),分别表示出发城市,目的城市的编号和游客的数量(1<T<100000)。保证两个城市间最多只有一条道路。 

Output

对于每组输入数据,输出最少的往返次数。 

Sample Input

1

7 10

1 2 30

1 3 15

1 4 10

2 4 25

2 5 60

3 4 40

3 6 20

4 7 35

5 7 20

6 7 30

1 7 99

 

Sample Output

5

 

思路分析:

根据题目给出的信息和例子我们可以看到,从17的最优路径是1->2->4->7,其中,最大的运载量取决于这条路径中最小的值,也就是252->4)。而且导游要陪同他们一起到达目的地,所以每次最多只能够运送24人,要运99人,就是至少需要跑4趟了。

 

我们先介绍一个算法,Floyd-Warshall算法。在学习离散数学结构的时候,我们曾经用过这个算法来求传递闭包问题。

我们把刚才说的得到的结果称为最优解。

 

 

 

优解有三种情况:

1、两点的直达是最优的,比如从12,13

2、两点间只通过一个中间点,得到最优解,如15的最优解是60

3、两点间用通过两各以上的顶点而获得最优解

 

对于第一种情况,不需要计算,得到的解是唯一的,也是最优的。

对于第二种情况,使用Floyd算法就是,遍历除了起点和终点的其他所有点,然后看看通过哪一个点得到的结果是最优的(就是通过找所有通过一个点到达终点的边中的最小值)。

对于第三情况,先将所有的点都化简成第二种情况就可以了。

 

核心代码:

  for(k = 0; k < n; k++)

    for(i = 0; i < n; i++)

      for(j = 0; j <n; j++)

    D[i][j] = max(D[i][j], min(D[i][k], D[k][j]));

 

这是一种动态规划算法,它来源于一个递归的解:

 

If k==0

dij = wij

else

dij = max(dij(k-1), min(dik(k-1), dkj(k-1)))

 

 

按照这种方法自底向上计算出最优解

#include <stdio.h>

const int MAX = 100;

int max(int a, int b) {
  return a > b ? a : b;
}

int min(int a, int b) {
  return a < b ? a : b;
}

int floyd_warshall(int G[MAX][MAX], int n, int start, int end) {
  int D[MAX][MAX];
  int i, j, k;

  for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
      D[i][j] = G[i][j];
  
  for(k = 0; k < n; k++)
    for(i = 0; i < n; i++)
      for(j = 0; j <n; j++)
    D[i][j] = max(D[i][j], min(D[i][k], D[k][j]));

  return D[start][end];
}

int main() {
  int cases;

  int N;  // city number
  int R;  // road number
  int C1, C2;  // the number of city
  int P;  // Path

  int S;  // start city
  int E;  // destination city
  int T;  // the numer of visitors

  int i, j;

  int matrix[MAX][MAX];

  int res;

  scanf("%d", &cases);

  while(cases--) {
    scanf("%d %d", &N, &R);

    for(i = 0 ; i < N; i++)
      for(j = 0; j < N; j++)
    matrix[i][j] = 0;

    for(i = 0; i < R; i++) {
      scanf("%d %d %d", &C1, &C2, &P);
      matrix[C1-1][C2-1] = matrix[C2-1][C1-1] = P;
    }

    scanf("%d %d %d", &S, &E, &T);

    res  = floyd_warshall(matrix, N, S-1, E-1);

    printf("%d\n", T/(res-1) + (T % (res - 1) ? 1 : 0));
  }

  return 0;
}


参考:

《算法导论》:第25章

floy算法应用例子:http://aduni.org/courses/algorithms/courseware/handouts/Reciation_07.html#25504

转载于:https://my.oschina.net/yejq08/blog/364078

相关文章:

  • 8611 大牛之路I
  • jCountdown倒计时插件jQuery
  • 【leetcode】Sort List (middle)
  • 模拟叫号系统
  • LINUX下如何开启FTP服务器
  • shell脚本中把txt文件中空格换成,逗号
  • 【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购
  • Java 中反射机制的深入研究
  • 从头开始学JavaScript (十二)——Array类型
  • FrameLayout的作用
  • 解决git push远程分支错误
  • Ubuntu 终端命令整理
  • 算法模板——线段树5(区间开根+区间求和)
  • 在Apache下开启SSI配置
  • PHP 文件上传功能
  • bearychat的java client
  • Create React App 使用
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JAVA 学习IO流
  • Java,console输出实时的转向GUI textbox
  • Java到底能干嘛?
  • PHP CLI应用的调试原理
  • Spring Cloud Feign的两种使用姿势
  • 浅谈web中前端模板引擎的使用
  • 日剧·日综资源集合(建议收藏)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 延迟脚本的方式
  • 再次简单明了总结flex布局,一看就懂...
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (145)光线追踪距离场柔和阴影
  • (转) 深度模型优化性能 调参
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net web项目 调用webService
  • .Net Winform开发笔记(一)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NetCore部署微服务(二)
  • .NET正则基础之——正则委托
  • .NET值类型变量“活”在哪?
  • /etc/fstab 只读无法修改的解决办法
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • @vue/cli脚手架
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [04] Android逐帧动画(一)
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [ARC066F]Contest with Drinks Hard
  • [C++进阶篇]STL中vector的使用
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
  • [leetcode] 3Sum
  • [LuoguP1141]01迷宫
  • [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计