当前位置: 首页 > news >正文

L2-001 紧急救援

  附上题目链接:https://www.patest.cn/contests/gplt/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的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。

 

分析: 这个就是在dijkstra上加了一维, 我们改一下dijkstra算法即可。 附上代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 500 + 50;
int N, M, S, D;
struct edge { int to, cost; };
vector<edge> G[maxn];
int node_weight[maxn];

struct Dij {
    int u;
    int dis, peo_num;
    bool operator< (const Dij &r) const {
        if(dis == r.dis) {
            return peo_num < r.peo_num;
        }else return dis > r.dis;
    }
};

bool vis[maxn];
int dist[maxn], peonum[maxn];
int pre[maxn];
int routenum[maxn];
void dijkstra(int u) {
    for(int i=0; i<N; i++) {
        vis[i] = 0;
        dist[i] = inf;
        peonum[i] = -inf;
        routenum[i] = 0;
    }
    priority_queue<Dij> que;
    pre[u] = -1; routenum[u] = 1;
    dist[u] = 0; peonum[u] = node_weight[u];
    que.push((Dij){u, dist[u], peonum[u]});
    while(!que.empty()) {
        Dij tp = que.top(); que.pop();
        if(vis[tp.u]) continue;
        vis[tp.u] = 1;
        for(int i=0; i<G[tp.u].size(); i++) {
            edge e = G[tp.u][i];

            if(dist[e.to] > dist[tp.u] + e.cost) routenum[e.to] = routenum[tp.u];
            if(dist[e.to] == dist[tp.u] + e.cost) routenum[e.to] += routenum[tp.u];

            if(dist[e.to] > dist[tp.u] + e.cost ||
                (dist[e.to] == dist[tp.u] + e.cost && peonum[e.to] < peonum[tp.u] + node_weight[e.to])) {
                    dist[e.to] = dist[tp.u] + e.cost;
                    peonum[e.to] = peonum[tp.u] + node_weight[e.to];
                    que.push((Dij){e.to, dist[e.to], peonum[e.to]});
                    pre[e.to] = tp.u;
                }
        }
    }
}

int main() {
    scanf("%d%d%d%d", &N, &M, &S, &D);
    for(int i=0; i<N; i++) scanf("%d", &node_weight[i]);
    for(int i=0; i<M; i++) {
       int u, v, c;
       scanf("%d%d%d", &u, &v, &c);
       G[u].push_back((edge){v, c});
       G[v].push_back((edge){u, c});
    }
    dijkstra(S);
    vector<int> route;
    printf("%d %d\n", routenum[D], peonum[D]);
    int now = D;
    route.push_back(now);
    while(pre[now] != -1) {
        now = pre[now];
        route.push_back(now);
    }
    for(int i=route.size()-1; i>=0; i--) {
        printf("%d%c", route[i], i==0?'\n':' ');
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/xingxing1024/p/5554736.html

相关文章:

  • Git Shell Warning
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • Network of Schools_POJ1236_Tarjan
  • 18121 排排坐看电影
  • 编辑中
  • html5 历史管理
  • fopen()函数以a+方式打开一个不存在的文件后读写出现问题
  • 第五章
  • Android Studio自定义注释模板
  • 觉得很有用存一份
  • Grails用CONSOLE测试,比写集成测试还快
  • 186.Reverse Words in a String II
  • 用C#代码来安装、卸载、启动、关闭服务
  • 《java入门第一季》之TreeSet存储自定义对象并保证排序和唯一
  • 创建模仿存储库 Making a Mock Repository 精通ASP-NET-MVC-5-弗瑞曼 Listing 7-5
  • hexo+github搭建个人博客
  • “大数据应用场景”之隔壁老王(连载四)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2019.2.20 c++ 知识梳理
  • centos安装java运行环境jdk+tomcat
  • CSS 专业技巧
  • git 常用命令
  • httpie使用详解
  • Javascript基础之Array数组API
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 百度小程序遇到的问题
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端面试之CSS3新特性
  • 如何利用MongoDB打造TOP榜小程序
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 鱼骨图 - 如何绘制?
  • linux 淘宝开源监控工具tsar
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • # centos7下FFmpeg环境部署记录
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #传输# #传输数据判断#
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #微信小程序:微信小程序常见的配置传值
  • (一)Neo4j下载安装以及初次使用
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)基于IDEA的JAVA基础12
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net中间语言BeforeFieldInit
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @Mapper作用
  • @media screen 针对不同移动设备
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C/C++] C/C++中数字与字符串之间的转换