PAT - L2-001. 紧急救援( Dijstra )
- -
PAT - L2-001. 紧急救援
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。
输入样例: 
4 5 0 3 
20 30 40 10 
0 1 1 
1 3 2 
0 3 3 
0 2 2 
2 3 2 
输出样例: 
2 60 
0 1 3
**
题解:这是一道求最短路径的题,这种类型的是我第一次做,开始的时候用的是Dijstra求出最短路径,然后用最短路径的值,和所到达d值,在再进行了一次DFS求最短路径的最大救援数,及其路线,最后样例过了,提交错了,改了好久找不到错。然后百度了一下看了这道题的题解。思路是Dijstra求最短路径的条数 + 一个其他条件的处理(满足最短路径的情况下求最大救援数)。
#include <bits/stdc++.h>
#define inf 99999999
using namespace std;
int n, m, s, d, x, y, z;
int a[505], e[505][505], vis[505], dis[505], pre[505], sum[505], count1[505], z1[505];
void init(){
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            if(i==j)e[i][j]=0;
            else e[i][j]=inf;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<m;i++){
        cin>>x>>y>>z;
        e[x][y] = e[y][x] = z;
    }
}
void Dijstra(int v0){
    for(int i=0;i<n;i++) dis[i]=inf;
    memset(vis,0,sizeof(vis));
    memset(count1,0,sizeof(count1));
    memset(sum,0,sizeof(sum));
    vis[v0] = 1;
 count1[v0] = 1;
    sum[v0] = a[v0];
    for(int i=0;i<n;i++){
        dis[i] = e[v0][i];
        //此部分为扩展部分 根据优先级应该是路径(一) 然后救援人数(二) 其中还要记录当前路径个数
        if( e[v0][i] != inf && i != v0 ){
                pre[i] = v0;            //用来记录经过i结点必须要经过的上一个结点
                sum[i] = a[v0] + a[i];  //用来求从v0到当前结点走过的最长救援人数
             count1[i] = 1;             //用来记录到达当前路径的个数。
        }
    }
    for(int j=0;j<n;j++){
        int min = inf, v = v0;
        //Dijstra第一步找出最短路径
        for(int i=0;i<n;i++){
            if(vis[i]==0 && dis[i]<min){
                min = dis[i]; v = i;
            }
        }
        vis[v] = 1;
        // 开始更新各个的值
        for(int i=0;i<n;i++){
            if(vis[i]==0) {
                if( dis[i] > dis[v] + e[v][i]) {
                       dis[i] = dis[v] + e[v][i];//优先级最高的路径先更新
                       pre[i] = v;
                       sum[i] = a[i] + sum[v];
                    count1[i] = count1[v];//路线变为上一个点的路线
                }
                else if(dis[i] ==  dis[v]+e[v][i]){
                    //如果相等的话优先级低的也要更新,且附加的值也会改变
                    count1[i] = count1[i] + count1[v];
                    //判断优先级底的是否更新
                    if( sum[i] < a[i] + sum[v] ){
                        sum[i] = a[i] + sum[v];
                        pre[i] = v;
                    }
                }
            }
        }
    }
}
int main(){
    cin>>n>>m>>s>>d;
    init();
    Dijstra(s);
    cout<<count1[d]<<" "<<sum[d]<<endl;
    int i = 0, cur = d;
    while(cur!=s){
        z1[i++] = cur;
        cur = pre[cur];
    }
    z1[i] = s;
    for(;i>0;i--)
        cout<<z1[i]<<" ";
    cout<<z1[0];
}PAT - L2-001. 紧急救援( Dijstra )的更多相关文章
- loj#6072 苹果树(折半搜索,矩阵树定理,容斥)
		loj#6072 苹果树(折半搜索,矩阵树定理,容斥) loj 题解时间 $ n \le 40 $ . 无比精确的数字. 很明显只要一个方案不超过 $ limits $ ,之后的计算就跟选哪个没关系了 ... 
- 城市间紧急救援(25 分)(dijstra变形)
		城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ... 
- PAT 垃圾箱分布(30分)dijstra
		垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ... 
- pat 团体天梯赛 L2-001. 紧急救援
		L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ... 
- PAT 甲级 1072 Gas Station (30 分)(dijstra)
		1072 Gas Station (30 分) A gas station has to be built at such a location that the minimum distance ... 
- PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)
		1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, to ... 
- PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)
		1018 Public Bike Management (30 分) There is a public bike service in Hangzhou City which provides ... 
- 天梯 L2 紧急救援 (dijkstra变形+记录路径)
		L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ... 
- Day 001:PAT练习--1091 N-自守数 (15 分)
		体验了一阵子现代生活后,朕发现敲代码还是挺有意思的.所以从今天开始,小编秦始皇开始记录朕做PAT题目的过程辣,那话不多说,开始今天的题目了: 题目描述: 如果某个数 K 的平方乘以 N 以后, ... 
随机推荐
- 二十七、详述 IntelliJ IDEA 设置 Sublime 代码颜色的方法
			相信很多同学在使用 Sublime 时,看到那些五颜六色的代码感觉爽的不行,而反过来,再来看 IntelliJ IDEA 默认的代码颜色就感觉有些不爽啦!实际上,我们是可以通过「导入设置」的方式,来设 ... 
- 报错Caused by: org.hibernate.AnnotationException: No identifier specified for entity:
			Caused by: org.hibernate.AnnotationException: No identifier specified for entity:. 原因: 1.没有给实体类ID 解决 ... 
- 【AngularJS学习笔记】开发时候的建议目录结构,基本开发步骤
			项目目录结构划分 Debug Node.JS的生成目录 Node_modules Node.Js的依赖项 Src 项目源文件 ----|framework 项目框架 --------|app --- ... 
- IDEA 相关问题
			IntelliJ Idea 常用快捷键列表 Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导 ... 
- Oracle 体系结构二 内存结构
			Oracle实例由共享内存块(SGA)以及大量的后台进程构成. SGA必须包含的数据结构: 数据库缓冲区缓存 日志缓冲区 共享池 可选的数据结构: 大池 JAVA池 流池 其他缓冲区缓存池 用户会话还 ... 
- Grub4dos boot
			Grub4dos 0.4.6a http://grub4dos.chenall.net/ Ghost11.5 bcdedit bcdedit /create /d "Grub4dos&quo ... 
- mysql的docker化安装
			mysql版本有很多,先看下各类版本号说明: 3.X至5.1.X:这是早期MySQL的版本.常见早期的版本有:4.1.7.5.0.56等. 5.4.X到5.7.X:这是为了整合MySQL AB公司社区 ... 
- nginx ssl pathinfo 伪静态 301 配置文件
			server { listen ; root /www/web/test_com/public_html; server_name test.com test.com; if ($host != '* ... 
- FireDAC的SQLite初探
			// uses FireDAC.VCLUI.Wait 之后, 可不用添加 TFDGUIxWaitCursor TFDConnection // 数据连接 TFDQuery ... 
- python中如何退出多层循环
			1.定义标记变量:利用变量值的变化退出循环 # 第一种嵌套形式 a = [[1, 2, 3], [5, 5, 6], [7, 8, 9]] # init_i = 0 # init_j = 0 flag ... 
