首页 > 其他分享 >通往奥格瑞玛的道路(单源最短路+二分)

通往奥格瑞玛的道路(单源最短路+二分)

时间:2023-08-06 09:22:38浏览次数:50  
标签:二分 瑞玛 idx vis int 单源 奥格 dijkstra que

//通往奥格瑞玛的道路
//二分最大的答案,然后有单点超过这个值就直接返回,继续二分
//每循环一次都要跑一遍最短路,这里选择时间复杂度更优的堆优化dijkstra
//坑点的较多,还请注意
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,MAX=2000000005;//错点之一,MAX开小了,二分的答案范围受限
int n,m,res,s,f[N],d[N];
int e[N],ne[N],w[N],h[N],idx;
typedef pair<int,int>pii;
bool vis[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool dijkstra(int u)
{   
    if(f[1]>u) return false;//错点之二,需要判断一下起点是否能走,不能走直接返回
    memset(d,0x3f,sizeof d);
    memset(vis,false,sizeof vis);
    priority_queue<pii,vector<pii>,greater<pii>>que;
    d[1]=0; que.push({0,1});
    while(!que.empty()){
        auto now=que.top(); que.pop();
        int dis=now.first,id=now.second;
        if(vis[id]) continue;
        vis[id]=true;
        for(int i=h[id];~i;i=ne[i]){
            int j=e[i];
            if(d[j]>dis+w[i]&&f[j]<=u){
                d[j]=dis+w[i];
                que.push({d[j],j});
            }
        }        
    }
    if(d[n]>s) return false;//错点三,不是d[n]>=0x3f3f3f3f/2,这里有血量限制,超过血量就不行
    else return true;
}
signed main()
{
    cin>>n>>m>>s;
    memset(h,-1,sizeof h);
    for(int i=1;i<=n;i++){
        int a;
        cin>>a;
        f[i]=a;
    }
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c),add(b,a,c);
    }
    if(!dijkstra(MAX)) return cout<<"AFK"<<endl,0;
    int l=1,r=MAX;
    while(l<r){
        int mid=l+r>>1;
        if(dijkstra(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
    return 0;
}

 

标签:二分,瑞玛,idx,vis,int,单源,奥格,dijkstra,que
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17609079.html

相关文章

  • 【LuoGU 1462】通往奥格瑞玛的道路——最短路+二分
    通往奥格瑞玛的道路题目背景在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量。有一天他醒来后发现自己居然到了联盟的主城暴风城。在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛。题目描述在艾泽拉斯,有\(n\)个城市。编号为\(1,2,3,\ldots,n\)。......
  • abc061d <单源最短路, spfa, 判断负环>
    D-ScoreAttack//https://atcoder.jp/contests/abc061/tasks/abc061_d//单源最短(长)路,spfa,判断负(正)环//本题是找最长的路径,实际上取个负号即可//注意,找到一个负环不能直接结束,只能进行标记cyc[]#include<iostream>#include<algorithm>#include<vect......
  • P3371 【模板】单源最短路径(弱化版)(C++_SPFA算法_链式向前星)
    题目背景本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步P4779。题目描述如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。输入格式第一行包含三个整数n,m,s,分别表示点的个数、有向边的个数、出发点的编号。接下来m行每行包含三个......
  • Bellman-Ford 单源最短路
    单源最短路,顾名思义,就是从一个起点到其余点的最短距离Bellman-Ford算法的思路是进行至多n-1轮的更新,每次遍历所有的边,进行松弛操作d[v]=min(d[v],d[u]+w);Bellman-Ford算法可以处理有负边权的图,也可以判负环,只要在第n轮还能进行松弛操作,说明存在负环例题洛谷P3371【模板】单......
  • 【模板】逆单源最短(反向建图) + spfa
    题目要求:不仅要求单源最短路径,还要求其余点到该点的最短路径做法:建立反图求逆单源最短路径,至于单源最短路径选择合适于题目即可参考题目1#include<iostream>2#include<queue>3#include<cstring>45usingnamespacestd;67typedeflonglongLL;8typ......
  • P1462 通往奥格瑞玛的道路
    城市之间有mm条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量。每次经过一个城市,都会被收取一定的过路费(包括起点和终点)。路上并......
  • HDFS写操作(简单源码解读)
    HDFS最重要的就是写流程了,学校老师教的时候也是重点介绍这个过程(虽然我并没有在任何面试中被问到过)。下面从画图和文字两个过程介绍写流程,这次读了源代码之后对整个过程更......
  • 【LOJ119】单源最短路 模板
    problem给你一个n个点m条边的无向图,求s到t的最短路。solutionSPFA模板codes#include<iostream>#include<queue>#include<cstring>#definemaxn2500+10#definemaxm620......
  • 【Luogu3371】【模板】单源最短路径(SPFA)
    problem给出一个有向图求从某一点出发到所有点的最短路solutionSPFAcodes#include<iostream>#include<queue>#include<cstring>#definemaxn10010#definem......
  • 算法之Dijkstra及其堆优化和SPFA:图上单源最短路径神器
    签到题……题目传送门SPFA算法本人曾经写过一篇有关Bellman-ford的博,但就算是挂了优化的ford也只能过这道题的弱化版。今天就先填个坑,先讲SPFA。在这里我直接认为你们......