P1462 通往奥格瑞玛的道路
这道题主要是考察二分和最短路的考察
只要看到在什么最值中求什么最值,就要往二分方向考虑
这道题的做法就是二分答案
还有一个注意点就是要注意建图,不要弄反、
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<unordered_map>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<cmath>
#include<set>
using namespace std;
//#define int long long
const int N=1e6+10;
const int mod=1e9+7;
int n,m,b;
struct node{
int e,v,w;
bool operator <(const node &a)const{
return v<a.v;
}
};
vector<node>G[N];
int a[N];
int dist[N];
int st[N];
void dijkstra(int x)
{
priority_queue<node>q;
q.push({1,b,0});
dist[1]=b;
while(!q.empty())
{
node c=q.top();
q.pop();
if(st[c.e]==1)continue;
st[c.e]=1;
for(int i=0;i<G[c.e].size();i++)
{
int j=G[c.e][i].e;
if(dist[j]<dist[c.e]-G[c.e][i].w&&x>=G[c.e][i].v)
{
dist[j]=dist[c.e]-G[c.e][i].w;
q.push({j,dist[j],0});
}
}
}
}
bool check(int x)
{
if(x<a[1])
{
return false;
}
memset(dist,-0x3f,sizeof(dist));
memset(st,0,sizeof(st));
dijkstra(x);
if(dist[n]>=0)
{
return true;
}
return false;
}
signed main()
{
scanf("%d%d%d",&n,&m,&b);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
G[u].push_back({v,a[v],w});
G[v].push_back({u,a[u],w});
}
int l=0,r=1e9+10;
while(l<r)
{
int mid=l+r>>1;
if(check(mid))
{
r=mid;
}
else
{
l=mid+1;
}
}
if(l>1e9)
{
cout<<"AFK"<<endl;
return 0;
}
cout<<l<<endl;
return 0;
}```
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!