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. Java容器Set接口

    Set接口的实现,可以方便地将指定的类型以集合类型保存在一个变量中.Set是一个不包含重复元素的Collection,更确切地讲,Set 不包含满足 e1.equals(e2) 的元素对,并且最多包含 ...

  2. C/S模式和B/S模式

    C/S模式和B/S模式 1.C/S模式(Client/Server,客户机/服务器模式) 如QQ 暴风影音,PPlive等应用软件都是C/S模式 是一种软件系统结构的一种,C/S模式是基于企业内部网络 ...

  3. weblogica 启动managed server 不用每次输入密码

    [weblogic@node2 AdminServer]$ pwd /home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains ...

  4. verilog中wire与reg类型的区别

    每次写verilog代码时都会考虑把一个变量是设置为wire类型还是reg类型,因此把网上找到的一些关于这方面的资料整理了一下,方便以后查找. wire表示直通,即只要输入有变化,输出马上无条件地反映 ...

  5. vue总结 08状态管理vuex

      状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管 ...

  6. 一篇文章读懂开源web引擎Crosswalk-《转载》

    前言 Web技术的优势早已被广大应用开发者熟知,比如可与云服务轻松集成,基于响应式UI设计的精美布局,高度的开放性,跨平台能力, 高效的分发与部署等等.伴随着移动互联网的快速发展与HTML5技术的逐步 ...

  7. js字符串基本操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtm ...

  8. ZOJ 3537 Cake(凸包+区间DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形 ...

  9. sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结)

    由于业务逻辑的多样性,经常得在sql server中查询不同数据库中数据,这就产生了分布式查询的需求 现我将开发中遇到的几种查询总结如下: 1.access版本 --建立连接服务器 EXEC sp_a ...

  10. **PHP转义Json里的特殊字符的函数

    http://www.banghui.org/11332.html 在给一个 App 做 API,从服务器端的 MySQL 取出数据,然后生成 JSON.数据中有个字段叫 content,里面保存了文 ...