首页 > 其他分享 >abc325E 火车+班车的最短路

abc325E 火车+班车的最短路

时间:2024-03-09 09:33:05浏览次数:23  
标签:班车 int 短路 ans push inf rep abc325E

题面:有n座城市,从城市i到城市j可以坐班车,需要A*D[i][j]时间,也可以坐火车,需要B*D[i][j]+C时间。可以从班车换到火车,但反过来不行。换乘时间不计,求从城市1到城市n的最短时间。
范围:n<1000; A,B,C<1E6; D[i]][j]<1E6并且D[i][i]=0。

思路:先预处理出任意两城市之间的耗时,包括班车D[i][j]和火车d[i][j],然后边跑dijkstra边dp,即班车后续可以是班车或火车,而火车后续只能是火车。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

const int N = 1005;
const int inf = 1E18;
int n, A, B, C, D[N][N], d[N][N], ans[N][2];
void dijkstra(int s) {
    rep(i,1,n) ans[i][0] = ans[i][1] = inf;
    priority_queue<tuple<int,int,int>> q;
    q.push({0,s,0});
    q.push({0,s,1});
    while (!q.empty()) {
        auto [c,x,f] = q.top(); q.pop();
        if (ans[x][0] == inf && f == 0) {
            ans[x][0] = -c;
            rep(i,1,n) {
                if (ans[i][0]==inf) {
                    q.push({c-D[x][i],i,0});
                }
                if (ans[i][1]==inf) {
                    q.push({c-d[x][i],i,1});
                }
            }    
        }
        if (ans[x][1] == inf) {
            ans[x][1] = -c;
            rep(i,1,n) {
                if (ans[i][1]==inf) {
                    q.push({c-d[x][i],i,1});
                }
            }
        }
    }
}
void solve() {
    cin >> n >> A >> B >> C;
    rep(i,1,n) rep(j,1,n) {
        cin >> D[i][j];
        if (i != j) {
            d[i][j] = D[i][j] * B + C;
            D[i][j] = D[i][j] * A;
        }
    }
    dijkstra(1);
    cout << min(ans[n][0],ans[n][1]) << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:班车,int,短路,ans,push,inf,rep,abc325E
From: https://www.cnblogs.com/chenfy27/p/18062276

相关文章

  • 最短路径算法
    最短路径我们把边具有权重的图称为带权图,权重可以理解为两点间的距离。一个图中任意两点会有多条路径联通,最短路径就是这些路径中最短的一条。负环:环中所有边权之重和小于0的环Floyed算法算法思想如何让两个点(假设a到b)的距离变短,只能引入第三个点k,通过k进行中转即a->k->b,当......
  • 最短路径问题的Dijastra算法
    求节点间最短路径的Dijastra算法思路概述给定一个权值非负的有向连通图,求某个特定原点(假定节点编号为0)到终点的最短路径权值之和。Dijastra算法采用贪心思想,每次选取最短距离可到达的点确定对应路径权值之和,并用以更新其它邻接点的可到达最短距离直至确定终点或者所有节......
  • leetcode--1976. 到达目的地的方案数(最短路)
    记录12:052024-3-5https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/通过最短路找到从源点到目标点距离,在更新的过程中,对某个点记录下可以达到最短距离的父亲节点,然后从目标点往回dp就可以了(有种逆向拓扑排序的感觉)当然这是不必要的,在更新最短距离的......
  • 最短路算法模版集合
    例题https://www.luogu.com.cn/problem/P1339朴素dijkstra(邻接表)dijkstra正确性来自于贪心也就是st数组内的数(dist)必须逐渐变大这样才能保证后面的数更新的时候,当前的第三边dist[t]都是最小值[详见](https://www.acwing.com/solution/content/94237/)dist[x]表示x......
  • 最短路
    1算法描述在一图中,从一点出发,沿图的边走到另一点所经过的路径中,各边上权值和最小的路径,叫做最短路径。最短路算法就是求解最短路径问题的算法。其中,单源最短路径指从图中某一点到另外所有点的最短路径;多源最短路径指从图中每一点到另外所有点的最短路径。2四大最短路算法2.1......
  • && 短路效果测试
    C#:staticvoidMain(string[]args){boolresult=true;result&=Func();result&=Func();result&=Func();Console.WriteLine("&=最后结果:{0}\n",result);Console.ReadKey();result=result......
  • SPFA最短路
    目录从Bellman-Ford开始核心思想模拟算法执行过程时间复杂度模板spfaspfa优化的思想模板从Bellman-Ford开始对于所有边权都大于等于0的图,任意两个顶点之间的最短路,显然不会经过重复的顶点或者边。也就是说任意一条最短路经过的定点数不会超过n个,边不会超过n-1条边而对于有边权......
  • 分层图最短路
    分层最短路用更加具体或者形象一点的说法就是有限制的最短路径问题。通常是拆点解决问题,原图中的点加上一个当前点的状态,成为一个新的点P4568[JLOI2011]飞行路线P4568[JLOI2011]飞行路线#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=......
  • 短路在JavaScript中是如何工作的?
    在JavaScript中,理解真实和虚假的值是编写高效简洁代码的基础。结合短路的概念,开发人员可以编写优雅的解决方案来应对常见的编程挑战。在本实践指南中,我们将探讨真实值和虚假值,并了解JavaScript中短路的机制。您可以从这里获取所有源代码。(本文内容参考:java567.com)目录了......
  • 最短路学习笔记
    最短路学习笔记单源最短路径问题(SingleSourceShortestPath,SSSP问题)。Part1DijkstraPart1.0Dijkstra朴素算法洛谷P3371【模板】单源最短路径(弱化版)Dijkstra算法Dijkstra算法的流程如下:初始化$dist[1]=0$,其余节点的$dist$值为正无穷大。找出一个未被标记的......