通往奥格瑞玛的道路(在可以到达XX的情况下,经过的所有城市中最多的一次收取的费用的最小值是多少(dfs,dij,二分))

寻找从某城市到奥格瑞玛的路径,途中遭受联盟攻击损失血量,每个城市收取过路费。目标是最小化所有路径中单次最高费用,而非总费用。通过链式向前星+Dijkstra或邻接表+二分+Dijkstra算法求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

P1462 通往奥格瑞玛的道路

从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。
这里血量相当于两点之间边的长度
每次经过一个城市,都会被收取一定的过路费(包括起点和终点)
过路费相当于点的权值

在可以到达奥格瑞玛的情况下,他所经过的所有城市中 最多的一次收取的费用 的最小值是多少
这道题其实是,只要能苟到奥格瑞玛就行,哪怕血量只剩1都行。然后费用也不是看总和,而是看单次交费的最大值。
比如 路径A:1-3-4-5 的收费分别是1,3,3,1, B:1-2-5 的收费分别是1,4,1,这时候他会选择走A

链式向前星+Dijkstra和DFS的结合体??(66msO2)

#include <bits/stdc++.h>
using namespace std;
inline void inn(int & x) {
   
    int f = 1; x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9')   {
   if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9') {
   x = x * 10 + ch - '0'; ch = getchar();}
    x *= f;
}

int V,E,b,cnt,f[10010];
struct edge{
                   //边,h是血量
    int to,next,h;   
}ed[100010];
int head[10010];

struct node{
                   //点,h是剩余血量
    int num,cost,h;
    friend bool operator < (node a ,node b){
   
        return a.cost>b.cost;    
    }
} nodes[10010] ;

inline void addedge(int from,int to,int h){
   
    ed[++cnt].h=h;
    ed[cnt].next=head[from];
    ed[cnt].to=to;
    head[from]=cnt;
}
inline int dij_dfs(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值