1003. Emergency (25)

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 

最短路径搜索,比较麻烦的是,必须统计所有最短路径的数量,所以在找到相同cost路径时必须把路径的数量相加,体现在代码的第56~60之间。

代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <limits.h>
 4 
 5 int dijkstra(int,int,int&,int&);
 6 int N,M,c1,c2;
 7 int num_rescue[];
 8 int map[][];
 9 int cost[];
 int num_path[];
 int num_res_gather[];
 int flag[];
 int main()
 {
     int i;
     int s,e,c;    
     while (scanf("%d%d%d%d",&N,&M,&c1,&c2) != EOF){
         memset(num_rescue,,sizeof(num_rescue));
         memset(map,,sizeof(map));
         for(i=;i<N;++i)
             cost[i] = INT_MAX;
         memset(num_path,,sizeof(num_path));
         memset(num_res_gather,,sizeof(num_res_gather));
         memset(flag,,sizeof(flag));
         for (i=;i<N;++i){
             scanf("%d",&num_rescue[i]);
         }
         for (i=;i<M;++i){
             scanf("%d%d%d",&s,&e,&c);
             map[s][e] = c;
             map[e][s] = c;
         }
         cost[c1] = ;
         num_path[c1] = ;
         num_res_gather[c1] = num_rescue[c1];
         flag[c1] = ;
         int path,rescue;
         dijkstra(c1,c2,path,rescue);
         printf("%d %d\n",path,rescue);
     }
     return ;
 }
 
 int dijkstra(int start,int end,int& path,int& rescue)
 {
     int s = start;
     while(!flag[end]){
         int i;
         for (i=;i<N;++i){
             if(!flag[i] && map[s][i]){
                 if (cost[s] + map[s][i] < cost[i]){
                     cost[i] = cost[s] + map[s][i];
                     num_path[i] = num_path[s];
                     num_res_gather[i] = num_res_gather[s] + num_rescue[i];
                 }
                 else if (!flag[i] && cost[s] + map[s][i] == cost[i]){
                     num_path[i] = num_path[s] + num_path[i];
                     num_res_gather[i] = ( num_res_gather[i] > num_res_gather[s] + num_rescue[i]? 
                         num_res_gather[i] : num_res_gather[s]+num_rescue[i]);
                 }
             }
         }
         i = ;
         while(flag[i++]);
         int min_cost = cost[--i];
         s = i;
         for (++i;i<N;++i){
             if (!flag[i] && cost[i] < min_cost){
                 min_cost = cost[i];
                 s = i;
             }
         }
         flag[s] = ;
     }
     path = num_path[end];
     rescue = num_res_gather[end];
     return cost[end];
 }

PAT 1003的更多相关文章

  1. PAT 1003我要通过!

    PAT 1003 我要通过! 答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出&qu ...

  2. PAT 1003 我要通过!(20)(代码+思路)

    1003 我要通过!(20)(20 分)提问 "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下 ...

  3. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  4. PAT 1003. 我要通过!(20) JAVA

    参考http://blog.csdn.net/bin8632/article/details/50216297 答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答 ...

  5. PAT 1003. 我要通过!(20)

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&quo ...

  6. PAT 1003. Emergency (25)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  7. 浙大 pat 1003 题解

    1003. Emergency (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  8. PAT 1003. Emergency (25) dij+增加点权数组和最短路径个数数组

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  9. PAT 1003 我要通过!

    https://pintia.cn/problem-sets/994805260223102976/problems/994805323154440192 “答案正确”是自动判题系统给出的最令人欢喜的 ...

随机推荐

  1. 感知器Perceptron

    Perceptron: 1.一种基于监督的线性分类器,其特点是:1)模型简单,具有很少的学习参数:2)具有可视性,一条直线即可划分:3)基于人工神经网络的原理. 其结构图为:  2.学习的关键技术: ...

  2. Centos yum源更新为阿里云

    阿里云镜像网址 http://mirrors.aliyun.com/   更新步骤 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d ...

  3. 解决oracle启动的错误: ORA-00119 ORA-00132

    $ sqlplus / as sysdbaSQL>create pfile fromspfile修改$ORACLE_HOME/dbs下的文件initDEV.ora中的*.local_listen ...

  4. Hibernate之管理session与批处理

    1. Hibernate 自身提供了三种管理Session对象的方法 –Session对象的生命周期与本地线程绑定 –Session 对象的生命周期与JTA事务绑定 –Hibernate 委托程序管理 ...

  5. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

  6. C#的dll被其他程序调用时,获取此dll正确的物理路径

    当C# dll被其他程序调用时,用Application.StartupPath获取的dll路径并不一定是此dll的物理路径,有可能是调用程序的路径. 以下方法或者能够获取dll正确的物理路径(未经过 ...

  7. Android:从程序员到架构师之路Ⅲ_高焕堂

    Part-2: 从Android框架代码中学习设计 一 基础设计模式(Pattern)的代码:以Android为例 1.Template Method模式:IoC(控制反转)机制 2.Observer ...

  8. Serializable 剔除某些不想保存的字段 transient

    示例: package cn.com.chinatelecom.mms.pojo; import java.io.Serializable; public class Person implement ...

  9. WinForm中的DataGridView控件显示数据字典方案2

    winform代码分析object数据库 做这部分功能的时候,上网搜索了很多资料,发现很少涉及到这方面的解决方案,找了相关的问题帖子,很多人都叫使用视图去处理,当然,用视图是可以解决这个问题,但是,这 ...

  10. MATLAB remove outliers.

    Answer by Richard Willey on 9 Jan 2012 Hi Michael MATLAB doesn't provide a specific function to remo ...