1003 Emergency (25)(25 point(s))
problem
1003 Emergency (25)(25 point(s))
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 different 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
anwser
Dijkstra 解法
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define Max 511
int N, M, C1, C2;
int Rescue[Max], Map[Max][Max], Dis[Max], Pre[Max], W[Max], Diff[Max];
bool Vis[Max] = {false};
void Dijkstra(int s){
memset(Dis, INF, sizeof(Dis));
memset(W, 0, sizeof(W));
memset(Diff, 0, sizeof(Diff));
Dis[s] = 0;
W[s] = Rescue[s];
Diff[s] = 1;
for(int i = 0; i < N; i++) Pre[i] = i;
for(int i = 0; i < N; i++){
int u = 0, minn = INF;
for(int j = 0; j < N; j++){
if(!Vis[j] && Dis[j] < minn){
u = j;
minn = Dis[j];
}
}
if(u == C2 || minn == INF) return;
Vis[u] = true;
for(int v = 0; v < N; v++) {
if(!Vis[v]) {
if(Dis[u] + Map[u][v] < Dis[v]){
Dis[v] = Dis[u] + Map[u][v];
// Pre[v] = u;
// }
W[v] = W[u] + Rescue[v];
Diff[v] = Diff[u];
}else if (Dis[u] + Map[u][v] == Dis[v]){
Diff[v] += Diff[u];
if(W[u] + Rescue[v] > W[v]){
W[v] = W[u] + Rescue[v];
// Pre[v] = u;
}
}
}
}
}
}
int main(){
// freopen("test.txt", "r", stdin);
memset(Map, INF, sizeof(Map));
std::cin>>N>>M>>C1>>C2;
for(int i = 0; i < N; i++){
std::cin>>Rescue[i];
}
for(int i = 0; i < M; i++){
int c1, c2, L;
std::cin>>c1>>c2>>L;
Map[c1][c2] = Map[c2][c1] = L;
}
Dijkstra(C1);
std::cout<<Diff[C2]<<" "<<W[C2];
return 0;
}
/*
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
*/
DFS解法
#include<bits/stdc++.h>
#include<vector>
#define INF 0x3f3f3f3f
#define Max 511
int N, M, C1, C2;
int Rescue[Max], Map[Max][Max], Dis[Max], Pre[Max], W[Max], Diff[Max];
bool Vis[Max] = {false};
void Dijkstra(int s){
memset(Dis, INF, sizeof(Dis));
memset(W, 0, sizeof(W));
memset(Diff, 0, sizeof(Diff));
Dis[s] = 0;
W[s] = Rescue[s];
Diff[s] = 1;
for(int i = 0; i < N; i++) Pre[i] = i;
for(int i = 0; i < N; i++){
int u = 0, minn = INF;
for(int j = 0; j < N; j++){
if(!Vis[j] && Dis[j] < minn){
u = j;
minn = Dis[j];
}
}
if(u == C2 || minn == INF) return;
Vis[u] = true;
for(int v = 0; v < N; v++) {
if(!Vis[v]) {
if(Dis[u] + Map[u][v] < Dis[v]){
Dis[v] = Dis[u] + Map[u][v];
W[v] = W[u] + Rescue[v];
Diff[v] = Diff[u];
}else if (Dis[u] + Map[u][v] == Dis[v]){
Diff[v] += Diff[u];
if(W[u] + Rescue[v] > W[v]){
W[v] = W[u] + Rescue[v];
}
}
}
}
}
}
int minDis = INF, diff = 0, maxTeam = 0, vis[Max];
void DFS(int v, int dis, int team){
if(v == C2){
if(dis < minDis)
{
minDis = dis;
diff = 1;
maxTeam = team;
}else if(dis == minDis){
diff++;
if(team > maxTeam) maxTeam = team;
}
// std::cout<<team<<std::endl;
return ;
}
vis[v] = 1;
for(int i = 0; i < N; i++)
if(vis[i] == 0 && Map[v][i] != INF)
DFS(i, dis + Map[v][i], team + Rescue[i]);
vis[v] = 0;
}
int main(){
// freopen("test.txt", "r", stdin);
memset(Map, INF, sizeof(Map));
memset(vis, 0, sizeof(vis));
std::cin>>N>>M>>C1>>C2;
for(int i = 0; i < N; i++){
std::cin>>Rescue[i];
}
for(int i = 0; i < M; i++){
int c1, c2, L;
std::cin>>c1>>c2>>L;
Map[c1][c2] = Map[c2][c1] = L;
}
// Dijkstra(C1);
// std::cout<<Diff[C2]<<" "<<W[C2];
DFS(C1, 0, Rescue[C1]);
std::cout<<diff<<" "<<maxTeam;
return 0;
}
/*
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
*/
experience
- 注意审题,求的不是最短路,是最短路的不同路条数。
- 这个图不是单向图,是双向图。
- Dijkstra算法以及其变种需要熟悉。
单词复习 - scattered 分散的
1003 Emergency (25)(25 point(s))的更多相关文章
- MySQL5.7.25(解压版)Windows下详细的安装过程
大家好,我是浅墨竹染,以下是MySQL5.7.25(解压版)Windows下详细的安装过程 1.首先下载MySQL 推荐去官网上下载MySQL,如果不想找,那么下面就是: Windows32位地址:点 ...
- PAT 甲级 1006 Sign In and Sign Out (25)(25 分)
1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...
- 【PAT】1020 Tree Traversals (25)(25 分)
1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...
- 【PAT】1052 Linked List Sorting (25)(25 分)
1052 Linked List Sorting (25)(25 分) A linked list consists of a series of structures, which are not ...
- 【PAT】1060 Are They Equal (25)(25 分)
1060 Are They Equal (25)(25 分) If a machine can save only 3 significant digits, the float numbers 12 ...
- 【PAT】1032 Sharing (25)(25 分)
1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...
- 【PAT】1015 德才论 (25)(25 分)
1015 德才论 (25)(25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...
- 1002 A+B for Polynomials (25)(25 point(s))
problem 1002 A+B for Polynomials (25)(25 point(s)) This time, you are supposed to find A+B where A a ...
- PAT 甲级 1010 Radix (25)(25 分)进制匹配(听说要用二分,历经坎坷,终于AC)
1010 Radix (25)(25 分) Given a pair of positive integers, for example, 6 and 110, can this equation 6 ...
随机推荐
- 学号20155308 2016-2017-2 《Java程序设计》第5周学习总结
学号20155308 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 8.1 语法与继承架构 使用try...catch 注意多个catch一定把父类放后面 ...
- 边框画的三角形给shadow
本文地址:http://www.cnblogs.com/veinyin/p/8690882.html 要写一个对话气泡样式,我们首先想到的当然给是一个盒子,然后用边框画一个三角形定位过去. 如果不需 ...
- 【Linux 命令】sed 命令
文章转载自:https://www.jianshu.com/p/779f40985b20 文本分隔:------ # 在每一行后面增加一空行. sed G # 在每一行后面增加两行空行. sed &q ...
- python调用百度语音识别接口实时识别
1.本文直接上干货 奉献代码:https://github.com/wuzaipei/audio_discern/tree/master/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5% ...
- J - Borg Maze +getchar 的使用注意(二维字符数组的输入)
题目链接: https://vjudge.net/contest/66965#problem/J 具体思路: 首先将每个点之间的最短距离求出(bfs),A 或者 S作为起点跑bfs,这样最短距离就求出 ...
- Exif xss
这种XSS出现的状况会特别少. Exif是啥??? 可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数 ...
- HTML5 之图片上传预处理
在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 像我这么为用户着想的程序员,绝对不会让这种事情发生的, ...
- 利用vw+rem实现移动web适配布局
基本概念 1.单位 Px(CSS pixels) 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的 其实是相对于某个设备而言的 ...
- PHP实现菜单无限极分类
菜单数据 这里我们的菜单数据是临时数据, 没有从数据库中查询处理,数据基本和数据库中的的相似. 数据如下: $items = array( 1 => array('id' => 1, 'p ...
- POJ 1236 Network of Schools(tarjan求强连通分量+思维)
题目链接:http://poj.org/problem?id=1236 题目大意: 给你一个网络(有向图),有两个任务: ①求出至少同时需要几份副本可以使得整个网络都获得副本 ②至少添加多少信息表(有 ...