PAT 1003 Emergency 最短路
As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible.
Input
Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (<= 500) – the number of cities (and the cities are numbered from 0 to N-1), M – the number of roads, C1 and C2 – the cities that you are currently in and that you must save, respectively. The next line contains N integers, where the i-th integer is the number of rescue teams in the i-th city. Then M lines follow, each describes a road with three integers c1, c2 and L, which are the pair of cities connected by a road and the length of that road, respectively. It is guaranteed that there exists at least one path from C1 to C2.
Output
For each test case, print in one line two numbers: the number of diferent shortest paths between C1 and C2, and the maximum amount of rescue teams you can possibly gather. All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.
Sample Input
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
Sample Output
2 4
题目意思:有n个城市m条路相连,每个城市都有一些救援队,给定起点城市和C1和终点城市C2,求从起点到终点最短路径的条数以及最短路径上能够调动来的救援队的数目。
解题思路:和一般求最短路的题目不同,这里所求的是最短路的数目和最短路上点的权值和(将城市看做点,那么每个城市中救援队的数目就可以看成点的权值)。其实既然是最短路,无非就是那几个算法,这里我们来考虑最短路数目不唯一的原因,从起点到终点的边的权值和是一样的,但经过的点是不一样的,这可以用Dijkstra来对每一个点逐步贪心,判断是否需要纳入到最短路结点的集合中。这里用dis[i]表示从起点C1到i点最短路的路径长度,用num[i]表示从起点到i点最短路的个数,用w[i]表示从起点到i点救援队的数目之和。当判定dis[u] + e[u][v] < dis[v]的时候,也就是说新纳入的u点可以减短到v的路径长度,是符合要求的,不仅仅要更新dis[v],还要更新num[v] = num[u], w[v] = weight[v] + w[u]; 如果dis[u] + e[u][v] ==dis[v],也就是说新纳入的u点,经过u到达v的路径长度和不经过u到v的路径长度一致,这就产生了两条最短路了,这时候要更新num[v] += num[u],⽽且判断⼀下是否权重w[v]更⼩,如果更⼩了就更新w[v] = weight[v] + w[u];
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- const int inf= ;
- using namespace std;
- int n,m,c1,c2;
- int e[][];
- int w[];//救援队数目之和
- int dis[];//从起点到i点最短路径的长度
- int num[];//最短路径的条数
- int weight[];//第i个城市救援队数目,点权
- bool vis[];
- int main()
- {
- int a,b,c,i,j,mins,u,v;
- scanf("%d%d%d%d",&n,&m,&c1,&c2);
- for(i=; i<n; i++)
- {
- scanf("%d",&weight[i]);
- }
- fill(e[], e[] + * , inf);
- fill(dis, dis + , inf);
- for(i=; i<m; i++)//建图
- {
- scanf("%d%d%d",&a,&b,&c);
- e[a][b]=e[b][a]=c;
- }
- dis[c1]=;
- w[c1]=weight[c1];
- num[c1]=;//至少会有一条最短路
- for(i=; i<n; i++)//遍历所有的点
- {
- u=-;//因为是正权通路,这里设置为-1
- mins=inf;
- for(j=; j<n; j++)//找到距离已纳入点集合中的最近点
- {
- if(vis[j]==false&&dis[j]<mins)
- {
- u=j;
- mins=dis[j];
- }
- //printf("%d\n",mins);
- }
- if(u==-)
- {
- break;
- }
- vis[u]=true;//标记该点以纳入S集
- for(v=; v<n; v++)//更新刚纳入的u点与其他尚未纳入点之间的距离
- {
- if(vis[v]==false&&e[u][v]!=inf)
- {
- if(dis[u]+e[u][v]<dis[v])//Dijkstra
- {
- dis[v]=dis[u]+e[u][v];//更新边权
- num[v]=num[u];//最短路条数不会变
- w[v]=w[u]+weight[v];//最短路沿路的救援队数
- }
- else if(dis[u]+e[u][v]==dis[v])//出现边权相等
- {
- num[v]=num[v]+num[u];//产生了两条分路
- if(w[u]+weight[v]>w[v])//取点权最大的表示为到v的救援队数目
- {
- w[v]=w[u]+weight[v];
- }
- }
- }
- }
- }
- printf("%d %d",num[c2],w[c2]);
- return ;
- }
PAT 1003 Emergency 最短路的更多相关文章
- PAT 1003. Emergency (25)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
- PAT 1003. Emergency (25) dij+增加点权数组和最短路径个数数组
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
- PAT 1003 Emergency
1003 Emergency (25 分) As an emergency rescue team leader of a city, you are given a special map of ...
- PAT 1003 Emergency[图论]
1003 Emergency (25)(25 分) As an emergency rescue team leader of a city, you are given a special map ...
- PAT 1003. Emergency 单源最短路
思路:定义表示到达i的最短路径数量,表示到达i的最短径,表示最短路径到达i的最多人数,表示从i到j的距离, 表示i点的人数.每次从u去更新某个节点v的时候,考虑两种情况: 1.,说明到达v新的最短路径 ...
- PAT 1003 Emergency (25分)
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- 图论 - PAT甲级 1003 Emergency C++
PAT甲级 1003 Emergency C++ As an emergency rescue team leader of a city, you are given a special map o ...
- PAT甲级1003. Emergency
PAT甲级1003. Emergency 题意: 作为一个城市的紧急救援队长,你将得到一个你所在国家的特别地图.该地图显示了几条分散的城市,连接着一些道路.每个城市的救援队数量和任何一对城市之间的每条 ...
- PAT 甲级 1003. Emergency (25)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
随机推荐
- 聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数?
聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数 本文重点知识点速览: Vue 中的 watch 对象中的回调函数不能是箭头函数. 箭头函数中的 this 指向的是函数定义时所在的 ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [中篇]
我们在<上篇>利用dotnet new命令创建了一个简单的控制台程序,接下来我们将它改造成一个ASP.NET Core应用.一个ASP.NET Core应用构建在ASP.NET Core框 ...
- 因特尔CPU上TM和R标识的区别
TM是英文trademark的缩写,TM标志并非对商标起到保护作用,它与R不同,TM表示的是该商标已经向国家商标局提出申请,并且国家商标局也已经下发了<受理通知书>,进入了异议期,这样就可 ...
- C语言基于NIOSII的软件开发及流水灯设计
一.Quartus II 12.1 (32-Bit)进行硬件设计 1.所需要的系统元器件组成 2.系统电路图 二.Nios II 12.1 Software Build Tools for Eclip ...
- DUBBO: xml文件无法解析
xml是: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http:/ ...
- (2018版)webstorm的安装和破解
前言 相信使用HBuildX的各位都用过,所以这个webstorm就是用来代替的. 因为使用方式跟idea等软件差不多,如果习惯了idea的操作方式的可以试一试 安装webstorm 这是2018版的 ...
- (一)初识NumPy库(数组的创建和变换)
在学习数据分析时,NumPy作为最基础的数据分析库,我们能够熟练的掌握它是学习数据分析的必要条件.接下来就让我们学习该库吧. 学习NumPy库的环境: python:3.6.6 编辑器:pycharm ...
- Linux下设置mysql允许远程连接
最近在Linux上安装了Mysql,然后在Windows环境下通过Navicat来连接时,出现报错:1045 Access denied for user 'root'@'XXX' (using pa ...
- WPF炫酷UI及动画
偶然看见了一张图,感觉挺好看的,花了点时间将他转化成了我代码仓库的一部分.虽然不难但也费时间.其中除了背景是百度的一张底图,其他所有内容均通过WPF的Path.Line.TextBlock.Borde ...
- SQL Server启动/关闭xp_cmdshell
==>启用xp_cmdshell USE master RECONFIGURE WITH OVERRIDE RECONFIGURE WITH OVERRIDE RECONFIGURE WITH ...