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

L2-001 紧急救援

注意题目没有说边的数量,实际最多有5e5条边,开小了第四个样例会错!!!

- 思路: Dijkstra 求最短路并且维护路径条数和最大人数

#include<bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;
typedef long long ll;
const int N = 510, M = 5e5 + 10;

int n, m, s, d;
int e[M], ne[M], h[N], w[M], idx; // 链式前向星存图
int arr[N], dist[N], cnt[N], f[N], pre[N];
/*
  dist[i] 表示走到i这个点的最短距离
  cnt[i] 表示走到这个点的路径条数
  f[i] 表示走到这个点的最大点权和是多少
  pre[i] 表示是那个点走到 i 这个点 
*/
bool st[N];

void add(int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}

//堆优化版
void dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    priority_queue<pii, vector<pii>, greater<pii>> heap;
    // 初始化
    heap.push({0, s});  dist[s] = 0;
    cnt[s] = 1, f[s] = arr[s];

    while(heap.size())
    {
        int u = heap.top().second;
        heap.pop();
        if(st[u]) continue;
        st[u] = true;
        for(int i = h[u]; i != -1; i = ne[i])
        {
            int v = e[i];
            if(st[v]) continue;
            if(dist[v] > dist[u] + w[i]) 
            {
                pre[v] = u, cnt[v] = cnt[u], f[v] = f[u] + arr[v];
                dist[v] = dist[u] + w[i];
                heap.push({dist[v], v});
            }
            else if(dist[v] == dist[u] + w[i]) 
            {
                cnt[v] += cnt[u];
                if(f[v] < f[u] + arr[v]) {
                    f[v] = f[u] + arr[v];
                    pre[v] = u;
                }
            }
        }
    }
}

int main()
{
    memset(h, -1, sizeof h);
    cin >> n >> m >> s >> d;
    for(int i = 0; i < n; i ++) cin >> arr[i];
    for(int i = 1; i <= m; i ++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        add(a, b, c), add(b, a, c);
    }
    dijkstra();

    cout << cnt[d] << " " << f[d] << "\n";
    vector<int> path;
    while(true) {
        path.push_back(d);
        if(d == s) break;
        d = pre[d];
    }
    reverse(path.begin(), path.end());
    for(int i = 0; i < path.size(); i ++) {
        if(i == path.size() - 1) cout << path[i];
        else cout << path[i] << " ";
    }
    return 0;
}

http://www.dtcms.com/a/106428.html

相关文章:

  • 编译原理:first集和follow
  • Python数据类型 - 元组(Tuple)
  • 第四章:检索器(Retriever)设计:从向量到图谱
  • Windows 实战-evtx 文件分析--做题笔记
  • Qt中的数据解析--XML与JSON处理全攻略
  • 前端开发时的内存泄漏问题
  • 数据结构第6篇:手撕排序算法(插入、希尔、堆)
  • 【通用级联选择器回显与提交处理工具设计与实现】
  • 中和农信:让金融“活水”精准浇灌乡村沃土
  • RustDesk 开源远程桌面软件 (支持多端) + 中继服务器伺服器搭建 ( docker版本 ) 安装教程
  • windows使用Python调用7-Zip【按大小分组】压缩文件夹中所有文件
  • C# Winform 入门(3)之尺寸同比例缩放
  • 山东大学《多核平台下的并行计算》实验笔记
  • Mysql+Demo 获取当前日期时间的方式
  • 17查询文档的方式
  • CASAIM与哈尔滨电气集团达成战略合作,三维智能检测技术赋能电机零部件生产智造升级
  • 【DRAM存储器四十九】LPDDR5介绍--LPDDR5的低功耗技术之power down、deep sleep mode
  • ContextVars 在 FastAPI 中的使用
  • 最新26考研资料分享考研资料合集 百度网盘(仅供参考学习)
  • 逻辑漏洞之越权访问总结
  • LeetCode 2761 和等于目标值的质数对
  • Anywhere文章精读
  • c# 如何利用redis存储对象,并实现快速查询
  • 实时显示符合条件的完整宋词
  • 基于 DeepSeek 与天地图搭建创新地理信息应用
  • STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步
  • 使用ctags+nvim自动更新标签文件
  • 基于springboot汽车租赁系统
  • 【百日精通JAVA | SQL篇 | 第二篇】数据库操作
  • K8S集群搭建 龙蜥8.9 Dashboard部署(2025年四月最新)