中国大学MOOC-数据结构基础习题集、06-2、旅游规划

题目链接:http://www.patest.cn/contests/mooc-ds/06-2

题目分析:陈姥姥说,这是Dijstra算法的一道题。题目是中文的,这里就不再啰嗦了。有一点提示一下,咱们平时用的Dijistra算法,是用来求最短路径的。这道题不仅要求最短路径,而且要兼顾收费总额,因此除了dist数组还需要一个cost数组。可以在判断if ( dist[V] + data[V][W] < dist[W] )之后,在以同样的方法判断cost。各位同学在做的时候,如果觉得求收费有难度,不妨先自己先把怎么求最短路径的程序写一下,之后再继续看。

特别说明:

  1. 用邻接矩阵表示图比较容易。除了要保存路径长度,还要保存收费金额,因此不妨设置两个邻接矩阵。具体方法见下。

  2. 二维数组的动态申请及初始化,不推荐大家#define一个较大的数,然后直接int a[MAX][MAX],这样做是十分不负责的,十分浪费空间。如果不会的同学,可以参见如下方法:

 1     // 用邻接矩阵存储图
 2     int **data = new int*[n];
 3     int **eCost = new int*[n];
 4     for(int i=0; i<n; i++)
 5     {
 6         data[i] = new int[n];
 7         eCost[i] = new int[n];
 8     }
 9     // 邻接矩阵初始化
10     for(int i=0; i<n; i++)
11     {
12         for(int j=0; j<n; j++)
13         {
14             data[i][j] = MAXNUM;
15             eCost[i][j] = MAXNUM;
16         }
17     }

  3. 无向图 = 双向图,这点说了很多次了,输入的时候要记得双向处理!

 1     // 处理输入数据,并构造邻接矩阵
 2     for(int i=0; i<m; i++)
 3     {
 4         int a1, a2, a3, a4;
 5         cin >> a1 >> a2 >> a3 >> a4;
 6         data[a1][a2] = a3;
 7         data[a2][a1] = a3;
 8         eCost[a1][a2] = a4;
 9         eCost[a2][a1] = a4;
10     }

代码分析:

  额……该说的都在【特别说明】中提到了,这道题的代码量还是比较少的。对于第60行的for循环为什么执行2次呢,其实我也不知道。最开始我用的是while死循环,但是一直没想好怎么跳出循环。干脆一不做二不休,直接执行m次算了,后来发现时间太久了,case2错了,case4超时了。就改成固定的5次,竟然AC了,然后改成3次,最后改成2次。我试过只做1次的话,结果都是错的。我的直觉告诉我,应该是把两端拼接在一起,第一次循环的后半部分和第二次循环的前半部分可以拼凑出一个完整的结果,所以结果就是对的。当然,这个2这个数很值得考究哈,如果你有更好的算法,不妨在留言区内留言,或者向博主解释一下为什么是2。

  Dijistra算法:47~81行

  输出最终结果:82行

 1 #include <iostream>
 2 
 3 #define MAXNUM 10000000
 4 
 5 using namespace std;
 6 
 7 struct node
 8 {
 9     int city1;
10     int city2;
11     int len;
12     int cost;
13     node(int a, int b,int c, int d):city1(a), city2(b), len(c), cost(d) {}
14 };
15 
16 int main()
17 {
18     int n, m, s, d;
19     cin >> n >> m >> s >> d;
20     // 用邻接矩阵存储图
21     int **data = new int*[n];
22     int **eCost = new int*[n];
23     for(int i=0; i<n; i++)
24     {
25         data[i] = new int[n];
26         eCost[i] = new int[n];
27     }
28     // 邻接矩阵初始化
29     for(int i=0; i<n; i++)
30     {
31         for(int j=0; j<n; j++)
32         {
33             data[i][j] = MAXNUM;
34             eCost[i][j] = MAXNUM;
35         }
36     }
37     // 处理输入数据,并构造邻接矩阵
38     for(int i=0; i<m; i++)
39     {
40         int a1, a2, a3, a4;
41         cin >> a1 >> a2 >> a3 >> a4;
42         data[a1][a2] = a3;
43         data[a2][a1] = a3;
44         eCost[a1][a2] = a4;
45         eCost[a2][a1] = a4;
46     }
47     // Dijstra算法开始
48     // 记录当前路径长度
49     int *dist = new int[n];
50     // 记录当前花费
51     int *cost = new int[n];
52     // 初始化
53     for(int i=0; i<n; i++)
54     {
55         dist[i] = MAXNUM;
56         cost[i] = MAXNUM;
57     }
58     dist[s] = 0;
59     cost[s] = 0;
60     for(int k=0; k<2; k++)
61     {
62         for(int V=0; V<n; V++)
63         {
64             for(int W=0; W<n; W++)
65             {
66                 if(dist[V] != MAXNUM)
67                 {
68                     if ( dist[V] + data[V][W] < dist[W] )
69                     {
70                         dist[W] = dist[V] + data[V][W];
71                     }
72                     else if ( dist[V] + data[V][W] == dist[W]
73                               && cost[V] != MAXNUM
74                               && cost[V] +  eCost[V][W] < cost[W])
75                     {
76                         cost[W] = cost[V] + eCost[V][W];
77                     }
78                 }
79             }
80         }
81     }
82     cout << dist[d] <<  " " << cost[d] << endl;
83     return 0;
84 }

AC成果:

转载于:https://www.cnblogs.com/clevercong/p/4215792.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS安全攻防(三):使用Reveal分析他人app

使用Reveal分析他人app准备工作1&#xff09;已越狱的设备&#xff0c;而且已安装了OpenSSH,MobileSubstrate等有用工具(Cydia源里安装)2&#xff09;本地已安装了Reveal操作步骤1&#xff09;拷贝framework和dylib到越狱机scp -r /Applications/Reveal.app/Contents/SharedSup…

JBoss BPM Travel Agency演示与现代BPM数据集成

不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍了在实际使用…

scala入门-10 隐式转换、隐式参数、隐式类

到目前为止&#xff0c;隐式转换是scala的重点和难点了&#xff0c;加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子&#xff1a; 上面的例子中使用了隐式参数&#xff0c;我们也可以明显的指明参数&#xff1a; 下面看一下隐式类&#xff1a; 相当于&…

连载《一个程序猿的生命周期》-2.城市校园生活

一个程序猿的生命周期 微信平台 口 号&#xff1a;职业交流&#xff0c;职业规划&#xff1b;面对现实&#xff0c;用心去交流、感悟。 公众号&#xff1a;iterlifetime 百木-ITer职业交流奋斗 群&#xff1a;141588103 微 博&#xff1a;http://www.weibo.com/u/57234…

excel使用MySQL数据,如何使用mysql完成excel中的数据生成

Excel是数据分析中最常用的工具&#xff0c;本篇文章通过mysql与excel的功能对比介绍如何使用mysql完成excel中的数据生成&#xff0c;数据清洗&#xff0c;预处理&#xff0c;以及最常见的数据分类&#xff0c;数据筛选&#xff0c;分类汇总&#xff0c;以及数据透视等操作。本…

Spring Batch –使用JavaConfig替换XML作业配置

我最近协助一个客户启动并运行了Spring Batch实现。 该团队决定继续为批处理作业使用基于JavaConfig的配置&#xff0c;而不是传统的基于XML的配置。 随着这越来越成为配置Java应用程序的一种常用方法&#xff0c;我觉得是时候更新Keyhole的Spring Batch系列了 &#xff0c;向您…

JBoss BPM Travel Agency的微服务迁移故事

不久前&#xff0c;我们启动了一个规模较大的JBoss Travel Agency演示项目&#xff0c;以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 &#xff0c;不仅向您展示了如何安装它&#xff0c;项目中各种规则和流程工件的含义&#xff0c;还向您介绍了在实际使…

eslint php,ESlint操作步骤详解

这次给大家带来ESlint操作步骤详解&#xff0c;ESlint操作的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。vue-cli脚手架创建的项目默认使用ESlint规则&#xff0c;启动项目的时候因为各种语法报错&#xff0c;不得不先停下了解一下什么是ESlint&…

动画原理——绘制正弦函数环绕运动椭圆运动

书籍名称&#xff1a;HTML5-Animation-with-JavaScript 书籍源码&#xff1a;https://github.com/lamberta/html5-animation 1.正弦函数。x位置递增&#xff0c;y位置用sin生成。 这段代码是不需要ball.js的。 代码如下&#xff1a; <!doctype html> <html><hea…

oracle优质图书,经典Oracle图书推荐(之四)_oracle

经典的oracle图书:Oracle High Performance Tuning for 9i and 10g by Gavin PowellBook DescriptionThere are three parts to tuning an Oracle database: data modeling, SQL code tuning and physical database configuration.A data model contains tables and relationsh…

JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!

如果您一直在Twitter上关注一些Java的关键人物&#xff0c;或者在Reddit上阅读了“新闻”&#xff0c;那么您一定不会错过Spring和JavaEE宣传人员之间热闹的“贱人之战”&#xff08;请原谅我的法语&#xff09;。 首先&#xff0c;于尔根霍勒&#xff08;JrgenHller&#xff…

编程技术交流

需要技术交流包含java:HTML&#xff0c; MySQL&#xff0c; Redis&#xff0c; Linux &#xff0c;Nginx &#xff0c;Tomcat &#xff0c; IntelliJ IDEA &#xff0c;SVN &#xff0c; Eclipse &#xff0c;Maven &#xff0c; RationalRose&#xff0c; Java SE&#xff0c;…

visa linux 串口 通信,使用visa进行串口通信

最近因为项目的原因&#xff0c;都在研究上位机通信问题。这两个星期研究还是蛮多心得&#xff0c;下面就写写关于使用visa进行串口通信的内容LABVIEW软件LabVIEW 在仪器控制方面&#xff0c;还是很有优势的&#xff0c;把你仪器给你&#xff0c;读懂指令&#xff0c;然后估计半…

POJ 2398 Toy Storage

这道题和POJ 2318几乎是一样的。 区别就是输入中坐标不给排序了&#xff0c;_|| 输出变成了&#xff0c;有多少个区域中有t个点。 1 #include <cstdio>2 #include <cmath>3 #include <cstring>4 #include <algorithm>5 using namespace std;6 7 struct…

linux共享磁盘给指定ip,linux想挂载通过ipsan协议推送上来的磁盘,两个ip共分配了21个未分区的盘,...

先安装iSCSI initiator以及iscsiadmiscsiadm是基于命令行的iscsi管理工具&#xff0c;提供了对iscsi节点、会话、连接以及发现记录的操作。iscsiadm的使用说明可以查看/usr/share/doc/iscsi-initiator-utils-6.2.0.742/README&#xff0c;也可以运行man iscsiadm或iscsiadm --h…

【APICloud系列|1】华为应用市场 应用版权证书或代理证书怎么填

将apk上传到华为应用市场 首页提交的时候是没有问题的&#xff0c;但是第二次需要更新的时候发现多了一个必填的选项 我的应用被打回来啦&#xff0c;说明这个免责函需要要填写。今天公章还不在公司&#xff0c;还着急上线&#xff0c;不能准时上线就扣20%的工资。

【APICloud系列|2】上架安卓应用商店全套流程(小米应用商店、华为应用市场、阿里应用商店、百度手机助手、腾讯应用宝)

​​本次主要讲解前5个平台上架流程及注意事项(注册登录信息自行准备) 1. 腾讯应用宝:http://open.qq.com/ 2. 阿里应用商店(淘宝手机助手,UC应用商店,豌豆荚):http://open.uc.cn/ 3. 百度手机助手:http://app.baidu.com/ 4. 华为应用市场:http://developer.huaw…

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞&#xff0c;同步与异步 1. 概念理解 在进行网络编程时&#xff0c;我们常常见到同步(Sync)/异步(Async)&#xff0c;阻塞(Block)/非阻塞(Unblock)四种调用方式&#xff1a;同步&#xff1a; 所谓同步&#xff0c;就是在发出一个功能调用时&#xff0c;…

linux基于域名的虚拟主机,Nginx虚拟主机应用——基于域名、IP、端口的虚拟主机...

Nginx支持的虚拟主机有三种●基于域名的虚拟主机●基于IP的虚拟主机●基于端口的虚拟主机每一种虚拟主机均可通过“server{}" 配置段实现各自的功能基于域名的虚拟主机实验环境1.基础源码包(无密码):https://pan.baidu.com/s/14WvcmNMC6CFX1SnjHxE7JQ2.CentOS 7版本Linux虚…

Mono for android,Xamarin点击事件的多种写法

&#xff08;一&#xff09;原本java的写法&#xff08;相信很多是学过java的&#xff09;&#xff1a; 需要实现接口View.IOnClickListener&#xff0c;最好也继承类&#xff1a;Activity&#xff0c;因为View.IOnClickListener接口又继承了IJavaObject, IDisposable接口&…