PAT甲级1003. Emergency
PAT甲级1003. Emergency
题意:
作为一个城市的紧急救援队长,你将得到一个你所在国家的特别地图。该地图显示了几条分散的城市,连接着一些道路。每个城市的救援队数量和任何一对城市之间的每条路线的长度在地图上标记。当你从其他城市发出紧急电话时,
你的工作是尽快引导你的人到这个地方,同时在途中尽可能多的呼唤城市中的别的救援队。
输入
每个输入文件包含一个测试用例。对于每个测试用例,第一行包含4个正整数:N(<= 500) - 城市数量(城市编号从0到N-1),M - 道路数量C1和C2 - 你目前在的城市,你必须分别保存。下一行包含N个整数,其中i-
整数是第i个城市的救援队数。然后M行跟随,每个描述一个具有三个整数c1,c2和L的道路,分别是通过道路连接的一对城市和该道路的长度。保证从C1到C2至少存在一条路径。
输出
对于每个测试用例,打印一行两个数字:C1和C2之间不同最短路径的数量以及可以收集的最大救援队数。
一行中的所有数字必须分开一个空格,并且在行的末尾不允许额外的空格。
思路:
题意就是求city1到city2的单源最短路径,并且求出最短路径下能搜集最多救援队数量。
ac代码:
C++
// pat1003.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
const int MAX = 0x7fffffff;
int road[501][501]; //记录city间的距离
int rescue[501]; //记录city的救援队
int n, m;
int starting, ending;
int len[501]; //记录start到各个点的距离
bool visit[501] = { false }; //保存已经遍历的点
int main()
{
cin >> n >> m >> starting >> ending;
for (int i = 0; i < n; i++)
cin >> rescue[i];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (i == j) road[i][j] = 0;
else road[i][j] = MAX;
}
}
for (int i = 0; i < n; i++)
len[i] = MAX;
int c1,c2;
for (int i = 0; i < m; i++)
{
cin >> c1 >> c2;
cin >> road[c1][c2];
road[c2][c1] = road[c1][c2];
if (c1 == starting) len[c2] = road[c1][c2];
if (c2 == starting) len[c1] = road[c1][c2];
}
int tempmin = MAX,tempindex;
int diffdis[501] = { 0 }; //记录有几种最短路径
diffdis[starting] = 1;
len[starting] = 0;
int maxpeo[501] = { 0 }; //记录能搜集的最大救援队数量
maxpeo[starting] = rescue[starting];
while(1)
{
tempmin = MAX;
for (int i = 0; i < n; i++)
{
if (!visit[i] && len[i] < tempmin)
{
tempmin = len[i];
tempindex = i;
}
}
visit[tempindex] = true;
for (int i = 0; i < n; i++)
{
if (!visit[i] && road[tempindex][i] != MAX && tempmin + road[tempindex][i] < len[i])
{
len[i] = tempmin + road[tempindex][i];
diffdis[i] = diffdis[tempindex];
maxpeo[i] = maxpeo[tempindex] + rescue[i];
}
else if (!visit[i] && road[tempindex][i] != MAX && tempmin + road[tempindex][i] == len[i])
{
diffdis[i] += diffdis[tempindex];
maxpeo[i] = max(maxpeo[i], maxpeo[tempindex] + rescue[i]);
}
}
if (tempindex == ending) break;
}
cout << diffdis[ending] << " " << maxpeo[ending] << endl;
return 0;
}
PAT甲级1003. Emergency的更多相关文章
- 图论 - 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 (25)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
- PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- PAT 甲级 1003 Emergency
https://pintia.cn/problem-sets/994805342720868352/problems/994805523835109376 As an emergency rescue ...
- PAT Advanced 1003 Emergency 详解
题目与翻译 1003 Emergency 紧急情况 (25分) As an emergency rescue team leader of a city, you are given a specia ...
- PAT Advanced 1003 Emergency (25) [Dijkstra算法]
题目 As an emergency rescue team leader of a city, you are given a special map of your country. The ma ...
- PAT甲级1003题解——Dijkstra
解题步骤: 1.初始化:设置mat[][]存放点之间的距离,vis[]存放点的选取情况,people[]存放初始时每个城市的人数,man[]存放到达每个城市的救援队的最多的人数,num[]存放到达每个 ...
- PAT (Advanced Level) Practise 1003 Emergency(SPFA+DFS)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
- PAT 解题报告 1003. Emergency (25)
1003. Emergency (25) As an emergency rescue team leader of a city, you are given a special map of yo ...
随机推荐
- JS的全局函数eval解析JSON字符串
JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需. ...
- 78.PL和PS通过BRAM交互共享数据
本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将结果 ...
- WebClient vs HttpClient vs HttpWebRequest
转载:http://www.diogonunes.com/blog/webclient-vs-httpclient-vs-httpwebrequest/ Just when I was startin ...
- 26_Python的内置函数
The Python interpreter has a number of functions and types built into it that are always available.P ...
- POJ 3278 Catch That Cow(简单BFS)
题目链接:http://poj.org/problem?id=3278 题目大意:给你两个数字n,k.可以对n执行操作(n+1,n-1,n*2),问最少需要几次操作使n变成k. 解题思路:bfs,每次 ...
- python基础(8)--迭代器、生成器、装饰器
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- linux中$的各种含义
我们先写一个简单的脚本,执行以后再解释各个变量的意义 # touch variable # vi variable 脚本内容如下: #!/bin/sh echo "number: ...
- Base64的好处
1. 昨天的<MIME笔记>中提到,MIME主要使用两种编码转换方式----Quoted-printable和Base64----将8位的非英语字符转化为7位的ASCII字符. 虽然这样的 ...
- web2.0 HW3 相关阅读材料
W3C官网的材料简直看花眼……除了挂出的文档,www-style@w3.org的一堆邮件也藏着很多宝,但是看下来又眼花了……(好在宝们基本都被W3C吸收了=.=) 主要来自W3C的官网w3.org的一 ...
- day4装饰器
Python装饰器 1.必备 def foo(): print(foo) <function foo at 0x7f62db093f28> >>> foo <fun ...