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))的更多相关文章

  1. MySQL5.7.25(解压版)Windows下详细的安装过程

    大家好,我是浅墨竹染,以下是MySQL5.7.25(解压版)Windows下详细的安装过程 1.首先下载MySQL 推荐去官网上下载MySQL,如果不想找,那么下面就是: Windows32位地址:点 ...

  2. 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 ...

  3. 【PAT】1020 Tree Traversals (25)(25 分)

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

  4. 【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 ...

  5. 【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 ...

  6. 【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 ...

  7. 【PAT】1015 德才论 (25)(25 分)

    1015 德才论 (25)(25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. 【leetcode 简单】 第一百一十一题 可怜的小猪

    有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水.它们从外观看起来都一样.如果小猪喝了毒药,它会在15分钟内死去. 问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少 ...

  2. 20165227 实验三《敏捷开发与XP实践》实验报告

    2017-2018-4 20165227 实验三<敏捷开发与XP实践>实验报告 实验内容 1.XP基础 2.XP核心实践 3.相关工具 实验要求 1.没有Linux基础的同学建议先学习&l ...

  3. Python缓存技术,装x新高度。

    一段非常简单代码 普通调用方式 def console1(a, b): print("进入函数") return (a, b) print(console1(3, 'a')) pr ...

  4. Mac下破解intellij IDEA 2018

    一.在进入下面网站下载破解补丁 http://idea.lanyus.com/ 二.在“应用程序”中找到已经安装的IntelliJ IDEA,在app上右键,选择“显示包内容”,如下图: 将下载的破解 ...

  5. 14 Go's Declaration Syntax go语言声明语法

    Go's Declaration Syntax go语言声明语法 7 July 2010 Introduction Newcomers to Go wonder why the declaration ...

  6. 根据经纬度坐标计算距离-python

    一.两个坐标之间距离计算 参考链接: python实现 1.Python 根据地址获取经纬度及求距离 2.python利用地图两个点的经纬度计算两点间距离 LBS 球面距离公式 美团app筛选“离我最 ...

  7. python面向对象(三)之继承

    继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...

  8. emacs设置了单例模式后无法设定文件关联解决办法

    emacs设置单例模式的本质就是使用下列参数启动: C:\emacs-24.5\bin\emacsclientw.exe --no-wait --alternate-editor="C:\e ...

  9. POJ 2516 Minimum Cost(拆点+KM完备匹配)

    题目链接:http://poj.org/problem?id=2516 题目大意: 第一行是N,M,K 接下来N行:第i行有K个数字表示第i个卖场对K种商品的需求情况 接下来M行:第j行有K个数字表示 ...

  10. 20165333实验一 JAVA开发环境的熟悉

    JAVA开发环境的熟悉-1 1建立"自己学号exp1"的目录 2 在"自己学号exp1"目录下建立src,bin等目录 3 javac,java的执行在&quo ...