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 ...
随机推荐
- 2016-2017-20155329 《Java程序设计》第7周学习总结
学号 2016-2017-20155329 <Java程序设计>第7周学习总结 教材学习内容总结 时间的度量 格林威治标准时间(GMT时间) 世界时(UT) 国际原子时(TAI) 世界协调 ...
- Exp2:后门原理与实践
Exp2:后门原理与实践 1 实践目标 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主机操作Shell, 任务计划启动 (0.5分) 任务三: ...
- pentaho bi server 配置MySQL数据库
软件版本: jdk 1.7 MySQL 5.5 biserver-ce-6.1.0.1-196 (选择右下方的所有选项See All Activities) 一.前置环境安装 1.安装jdk(略) 2 ...
- VS2010 项目属性的默认包含路径设置方法
VS2010 项目属性的默认包含路径设置方法 分类: c++小技巧2014-01-10 10:16 1358人阅读 评论(0) 收藏 举报 c++ 有两种方法可以设置vs2010的默认包含路径 方法一 ...
- Unix/Linux系统时间函数API
首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...
- Spring4笔记10--SSH整合1--Spring与Hibernate整合
SSH 框架整合技术: 1. Spring与Hibernate整合(对比Spring与JDBC模板): Service业务层代码和测试类都不变,添加实体类的映射配置文件: <?xml versi ...
- 数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID)
数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instanc ...
- 比特币pow算法介绍
Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...
- OpenStack 监控解决方案
正如你们看到的那样,到目前为止(OpenStack Kilo),OpenStack自己的监控组件Telemetry并不是完美, 获取的监控数据以及制作出来的图表有时候让人匪夷所思,因其重点并不是监控而 ...
- 手淘移动适配方案flexible.js兼容bug处理
什么是flexible.js 移动端自适应方案 https://www.jianshu.com/p/04efb4a1d2f8 什么是rem 这个单位代表根元素的 font-size 大小(例如 元素的 ...