热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

L2001紧急救援最短路+dfs

L2-001紧急救援(25分)作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市
L2-001 紧急救援 (25 分)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2N500)是城市的个数,顺便假设城市的编号为0 ~ (N1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。

第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式:

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3


此题可用最短路模板走一遍找到最短路, 然后dfs一遍找到有多条路,并且记录一下路径。


1 #include
2 #define N 505
3 #define inf 0x3f3f3f3f
4 using namespace std;
5 int n, m;
6 struct Node{
7 int to, value;
8 friend bool operator<(const Node &a , const Node &b){
9 return a.value > b.value;
10 }
11 };
12 vector v[N];
13 int vis[N];
14 int val[N];
15 int fa[N], num[N];
16 int ans &#61; 0,way &#61; 0,weight &#61; 0,st &#61; 0;
17 int dis[N];
18 int x, y, z, s, d;
19 void short_path(int x){
20 priority_queue q;
21 q.push({x,0});
22 while(!q.empty()){
23 Node node &#61; q.top();
24 q.pop();
25 if(vis[node.to] &#61;&#61; 1)
26 continue;
27 vis[node.to] &#61; 1;
28 val[node.to] &#61; min(val[node.to], node.value);
29 ans &#43;&#43;;
30 if(ans &#61;&#61; n) break;
31 for(int i &#61; 0; i ){
32 Node an &#61; v[node.to][i];
33 if(vis[an.to] &#61;&#61; 0){
34 q.push({an.to, val[node.to]&#43;an.value});
35 }
36 }
37 }
38 }
39
40 void dfs(int x, int cnt, int nums, int step){
41 fa[step] &#61; x;
42 if(cnt &#61;&#61; ans && x &#61;&#61; d){
43 way&#43;&#43;;
44 if(weight < nums){
45 weight &#61; nums;
46 st &#61; step;
47 memcpy(dis, fa, sizeof(fa));
48 }
49 }
50 if(cnt > ans) return ;
51 for(int i &#61; 0; i ){
52 Node an &#61; v[x][i];
53 if(vis[an.to])
54 continue;
55 vis[an.to] &#61; 1;
56 dfs(an.to, an.value&#43;cnt, nums&#43;num[an.to], step &#43; 1);
57 vis[an.to] &#61; 0;
58 }
59 }
60
61 int main(){
62 scanf("%d%d%d%d", &n, &m, &s, &d);
63 for(int i &#61; 0; i ){
64 scanf("%d", &num[i]);
65 }
66 memset(vis, 0, sizeof(vis));
67 memset(val, inf, sizeof(val));
68
69 for(int i &#61; 0; i ){
70 scanf("%d%d%d", &x, &y, &z);
71 v[x].push_back({y, z});
72 v[y].push_back({x, z});
73 }
74 short_path(s);
75 ans &#61; val[d];
76 memset(vis, 0, sizeof(vis));
77 vis[s] &#61; 1;
78 dfs(s, 0, num[s], 0);
79 cout<" "<endl;
80 for(int i &#61; 0; i <&#61; st; i &#43;&#43;){
81 if(i &#61;&#61; 0)
82 printf("%d", dis[i]);
83 else
84 printf(" %d", dis[i]);
85 }
86 printf("\n");
87 return 0;
88 }

 


转:https://www.cnblogs.com/zllwxm123/p/10544197.html



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
教坏的黑天使_203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有