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. 简单把webdriver的find_element方法写成函数

    __author__ = 'jyd' from selenium.webdriver.common.by import By #driver webdriver实例化对象 #element 查询元素的 ...

  2. 《Python 学习手册4th》 第十章 Python语句简介

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...

  3. 我的Myeclipse黑色主题

  4. C#条件语句、循环语句

    一.程序的三种结构 顺序结构 分支结构 循环结构 二.条件语句if 语句是最有用的控制结构之一. if … else …语句的语法: if (布尔表达式)执行操作的语句  或if (布尔表达式)执行操 ...

  5. 常用的CSS Hack技术集锦

    来源:http://www.ido321.com/938.html 一.什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致相同的CSS输出的页面效果不同,这就需要CSS Ha ...

  6. WordPress的SEO技术

    原文:http://blog.wpjam.com/article/wordpress-seo/ 文章目录[隐藏] 内容为王 页面优化 标题 链接(URL) Meta 标签 语义化 H1 H2 H3 等 ...

  7. BestCoder Round #75 解题报告

    King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...

  8. 【暑假】[实用数据结构]UVa11991 Easy Problem from Rujia Liu?

    UVa11991 Easy Problem from Rujia Liu?  思路:  构造数组data,使满足data[v][k]为第k个v的下标.因为不是每一个整数都会出现因此用到map,又因为每 ...

  9. web服务器分析与设计(三)

    面向对象分析与设计第二步:健壮性分析,完善对象 通过上一篇的分析,已经得到了构建系统中最重要的对象-----实体对象,它们封装着构成系统最重要的数据,实体数据是系统的生命. 但是光有实体还系统是运转不 ...

  10. tomcat http https

    Tomcat如何既支持http又支持https?在server.xml中开启两个connector: http: <Connector port="8080" maxHttp ...