L2-001. 紧急救援

L2-001. 紧急救援

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

当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);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

题解:

  据说是dijkstra,然而并不会…………

  BFS多加两个状态多可以了,感觉没有问题。

代码 C++:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #define INF 0x7F7F7F7F
 5 #define MX 505
 6 struct Edge{
 7     int to, nxt, len;
 8 }edge[MX*MX];
 9 int head[MX], iE, pre[MX], siz[MX];
10 void addEdge(int u, int v, int len){
11     edge[iE].to = v; edge[iE].len = len; edge[iE].nxt = head[u];
12     head[u] = iE++;
13 }
14 struct Point{
15     int kind, siz, len;
16 }map[MX];
17
18 int n, m, s, d;
19 void red(){
20     memset(map, INF, sizeof map);
21     memset(head, -1, sizeof head); iE = 0;
22     scanf("%d%d%d%d", &n, &m, &s, &d);
23     int i, u, v, len;
24     for (i = 0; i < n; ++i) scanf("%d", siz + i);
25     for (i = 0; i < m; ++i){
26         scanf("%d%d%d", &u, &v, &len);
27         addEdge(u, v, len); addEdge(v, u, len);
28     }
29 }
30
31 void BFS(){
32     map[s].kind = 1; map[s].len = 0; map[s].siz = siz[s];
33     std::queue<int> q; q.push(s);
34     int u, v, i, nxtLen, nxtSiz;
35     while (!q.empty()){
36         u = q.front(); q.pop();
37         if (!map[u].kind || u == d) continue;
38         for (i = head[u]; ~i; i = edge[i].nxt){
39             v = edge[i].to;
40             nxtLen = map[u].len + edge[i].len; nxtSiz = map[u].siz + siz[v];
41             if (nxtLen == map[v].len){
42                 map[v].kind += map[u].kind;
43                 if (nxtSiz > map[v].siz){ map[v].siz = nxtSiz; pre[v] = u; }
44                 q.push(v);
45             }
46             if (nxtLen < map[v].len){
47                 map[v].kind = map[u].kind;
48                 map[v].siz = nxtSiz; pre[v] = u;
49                 map[v].len = nxtLen;
50                 q.push(v);
51             }
52         }
53         map[u].kind = 0;
54     }
55 }
56
57 int main() {
58     red();
59     BFS();
60     int i, j, opt[MX];
61     printf("%d %d\n", map[d].kind, map[d].siz);
62     for (i = d, j = 0; i != s; ++j, i = pre[i]) opt[j] = i;
63     for (opt[j] = s; ~j; --j) printf("%d%c", opt[j], "\n "[j > 0]);
64     return 0;
65 }
时间: 2024-10-12 08:05:45

L2-001. 紧急救援的相关文章

Java_计算器001,支持加减乘除,括号运算

暑假自学Java期间,为了练习Java编写的计算器001版本 1 import java.util.ArrayList; 2 //v1.0支持+-*/,负号 3 import java.util.Scanner; 4 public class Caculator_001 5 { 6 public static void main(String[] args) 7 { 8 Scanner input=new Scanner(System.in); 9 double result; 10 Strin

Java_计算器001,支持加减乘除,括号,小数点,√,^ 运算

对于001版本变更了对于负数的处理方式,增加了小数.√.^ 1 package caculator_002; 2 import java.util.ArrayList; 3 //001支持+-*/,负号 4 //002预期 支持小数点 开n次幂 求n次幂 5 6 import java.util.Scanner; 7 public class Caculator_002 8 { 9 public static void main(String[] args) 10 { 11 Scanner in

通俗易懂--岭回归(L2)、lasso回归(L1)、ElasticNet讲解(算法+案例)

1.L2正则化(岭回归) 1.1问题 想要理解什么是正则化,首先我们先来了解上图的方程式.当训练的特征和数据很少时,往往会造成欠拟合的情况,对应的是左边的坐标:而我们想要达到的目的往往是中间的坐标,适当的特征和数据用来训练:但往往现实生活中影响结果的因素是很多的,也就是说会有很多个特征值,所以训练模型的时候往往会造成过拟合的情况,如右边的坐标所示. 1.2公式 以图中的公式为例,往往我们得到的模型是: 为了能够得到中间坐标的图形,肯定是希望θ3和θ4越小越好,因为这两项越小就越接近于0,就可以得

keras 添加L2正则 和 dropout层

在某一层添加L2正则: from keras import regularizer model.add(layers.Dense(..., kernel_regularizer = regularizers(0.001),...)) 在某一层之后添加dropout层: model.add(layers.Dropout(0.5)) 原文地址:https://www.cnblogs.com/rising-sun/p/11625963.html

正则化方法:L1和L2 regularization、数据集扩增、dropout

本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习/深度学习算法中常用的正则化方法.(本文会不断补充) 正则化方法:防止过拟合,提高泛化能力 在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合).其直观的表现如下图所示,随着训练过程,网络在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大--因为训练出来的网络过拟合了训练集,对训练集外的数据却不work

PE 001~010

题意: 001(Multiples of 3 and 5):对小于1000的被3或5整除的数字求和. 002(Even Fibonacci numbers):斐波那契数列中小于等于4 000 000的偶数求和. 003(Largest prime factor):求600 851 475 143的最大质因数. 004(Largest palindrome product):求由两个三位数相乘得到的最大回文数. 005(Smallest multiple):求能被1~20中所有数整除的最小正整数.

【第四组】典型场景:查看导入的图片,工作序号:001,2017/7/6

场景 工作项序号001:查看导入的图片,最后修改时间:2017/7/6 1. 背景 1) 典型用户:罗小欧[主要].朱小叶[主要] 2) 用户的需求/迫切需要解决的问题 a. 罗小欧:出去玩拍了好多照片,想要在一个地方看到这些照片. b. 罗小欧:把照片放到了好几个文件夹,每次都要点开好几个文件夹,好麻烦. c. 朱小叶:我就想静静的欣赏下我们拍的照片. 3) 假设: a. 用户已经拍摄好照片 b. 用户指定的照片路径无误 2. 场景 罗小欧打开我们的TOUCH App,进入设置界面,添加他存放

JAVA程序设计心得001

JAVA程序设计心得001:java语言之所以能够跨平台,是因为java程序并不运行在操作系统中,而是运行在java虚拟机上.java虚拟机并不是硬件方面的东西,而是用于运行java程序的软件平台.JVM是分时操作系统的版本,例如运行在Windows中的jvm,当运行java程序时,虚拟机会吧该程序解析成window能够识别的代码,而java程序转移在linux系统中的JVM后,则就解析成Linux能够识别的代码.

(001)顺序栈的C++实现

(001)顺序栈的C++实现 2014/12/4     jxlijunhao 这里通过C++模板类来实现一个顺序栈: 1)初始化 2)入栈 3)出栈 4)取栈顶元素 在顺序栈中(一个数组中),操作的总是发生在数组的末尾 定义一个头文件 #ifndef SQ_STACK_H #define SQ_STACK_H #include<iostream> using namespace std; template<class T> class sq_stack { private: in

C++(笔)001.

1.编程范式 编程范式是指计算机编程的基本风格,C++可容纳多种程度范式,如面向对象编程.泛型编程及传统的过程式编程. 2.与C相比较 C++在C语言的基础上新加的特性如下: a.类和对象.继承 b.多态.虚函数和RTTI c.函数重载 d.引用变量 e.泛型编程 f.异常机制 g.命名空间 C++继承了C语言高效.简洁.快速和可移植性的传统,新增的面向对象编程特性,还有一个泛型编程的特性.在学习C++需要掌握C语言的基础知识,OOP思想和泛型编程的知识. 3.编程原理 计算机语言要处理两个概念