L2-001 紧急救援 (25 分)
 

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

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2)是城市的个数,顺便假设城市的编号为0 ~ (;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
作者: 陈越
单位: 浙江大学
时间限制: 200 ms
内存限制: 64 MB

PTA特色题目 麻烦

经典题目模板 求最短路的数目 求救援队最大的数目

 1 #include <stdio.h>
2 #include <iostream>
3 #include <vector>
4 #include <queue>
5 #include <algorithm>
6 #include <stack>
7 using namespace std;
8 int N, M, S, D;
9 const int inf = 2e9;
10 const int si = 505;
11 bool vis[si];
12 struct ed{
13 int to, t;
14 ed(int a, int b) {
15 to = a; t = b;
16 }
17 };
18 struct node{
19 int id, time;
20 node(int a, int b) {
21 id = a; time = b;
22 }
23 bool operator < (const node x) const {
24 return time > x.time;
25 }
26 };
27 vector<ed> G[si];
28 int jiuyuan[si], dis[si], pre[si];
29 int roadcnt[si], getjy[si];
30
31 priority_queue<node> q;
32 void dijkstra() {
33 fill(dis, dis + N , inf);
34 fill(vis, vis + N , 0);
35 dis[S] = 0;
36 roadcnt[S] = 1;
37 getjy[S] = jiuyuan[S];
38 q.push(node(S, 0));
39
40 while (!q.empty()) {
41 node no = q.top(); q.pop();
42 int id = no.id, time = no.time, jy = getjy[id];
43 if (vis[id]) continue;
44 vis[id] = 1;
45 for (int i = 0; i < G[id].size(); i++) {
46 int to = G[id][i].to, t = G[id][i].t;
47 int nt = t + time;
48 int njy = jy + jiuyuan[to];
49 if (dis[to] == nt) {
50 roadcnt[to] += roadcnt[id];
51 if (njy > getjy[to]) {
52 getjy[to] = njy;
53 pre[to] = id;
54 }
55 }
56 else if (dis[to] > nt) {
57 dis[to] = nt;
58 getjy[to] = njy;
59 roadcnt[to] = roadcnt[id];
60 pre[to] = id;
61 q.push(node(to, nt));
62 }
63 }
64 }
65 }
66 int main() {
67 cin >> N >> M >> S >> D;
68 for (int i = 0; i < N; i++)
69 cin >> jiuyuan[i];
70 for (int i = 0; i < M; i++) {
71 int a, b, c;
72 cin >> a >> b >> c;
73 G[a].push_back(ed(b, c));
74 G[b].push_back(ed(a, c));
75 }
76 dijkstra();
77 printf("%d %d\n", roadcnt[D], getjy[D]);
78 int crt = D;
79 stack<int> stk;
80 while (1) {
81 stk.push(crt);
82 if (crt == S) break;
83 crt = pre[crt];
84 }
85 while (1) {
86 cout << stk.top();
87 stk.pop();
88 if (stk.empty()) {
89 cout << endl;
90 break;
91 }
92 else cout << " ";
93 }
94 return 0;
95 }

L2-001 紧急救援 (25 分)的更多相关文章

  1. 5-5 城市间紧急救援 (25分)【最短路spfa】

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

  2. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  3. 天梯L2-001. 紧急救援(25分)

    L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...

  4. 城市间紧急救援(25 分)(dijstra变形)

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  5. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  6. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  7. 7-10 多项式A除以B (25分)(多项式除法)

    7-10 多项式A除以B (25分)   这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出 ...

  8. PTA - - 06-图1 列出连通集 (25分)

    06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...

  9. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

随机推荐

  1. 『高性能模型』卷积复杂度以及Inception系列

    转载自知乎:卷积神经网络的复杂度分析 之前的Inception学习博客: 『TensorFlow』读书笔记_Inception_V3_上 『TensorFlow』读书笔记_Inception_V3_下 ...

  2. XV Open Cup named after E.V. Pankratiev. GP of Central Europe (AMPPZ-2014)--B.Petrol

    多源最短路+并查集 #include <bits/stdc++.h> using namespace std; #define rep(i, j, k) for (int i = int( ...

  3. WDA基础十七:ALV不同行显示不同下拉

    1.给ALV结构添加VALUE SET字段. 2.初始化时将TYPE_SET字段设置为值范围. METHOD wddoinit . DATA: lo_node TYPE REF TO if_wd_co ...

  4. 2019/2/23Scala学习开始(Scala简介)

    Scala简介    Scala是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性. Scala运行在Java虚拟机上,并兼容现有的Java程序 ...

  5. A锚点实现,滚动页面内容改变tab选项

    Css: ul{margin:0;padding:0;list-style:none;} a{ text-decoration: none; outline:none; -webkit-tap-hig ...

  6. Kotlin 使用类似C# 的yield功能

    用过c#的可能对 yield 关键字爱不释手,那么在像我这种被迫上java贼船的人,就想找到类似的功能. 我使用的是kotlin,下面的方法演示了产生一个序列的功能. val fibonacciSeq ...

  7. 杨力第一次jjave作业

    感觉jave学起来比c语言难一点,格式要求较高,有更多的东西要记,但是只要认真学应该不是很难,自己应该多写程序.

  8. Sublime自动去除代码行尾多余的空格

    Preferences - > Settings - User 加入: "trim_trailing_white_space_on_save": true Ctrl+s就会自 ...

  9. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  10. spring 中IOC实验(一)

    软件151  王帅 1.三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类. 代码如下: package cn.com.chengang.s ...