Nelson @ 2019-09-29 20:56:40
#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
const int N=5e4+10;
const int inf=1e9+10;
int n,m,b,mid,maxcost,ans,cnt;
int fa[N],cost[N],judge[N],head[N<<1],dis[N];
struct edge{
int to,next,w;
}e[N<<1];
struct node{
int pos,len;
bool operator<(const node &x)const{
return x.len<len;
}
};
priority_queue<node> q;
void addedge(int from,int to,int w){
e[++cnt]=(edge){to,head[from],w};
head[from]=cnt;
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void dij(){
maxcost=cost[1];
dis[1]=0;
q.push((node){1,0});
while(!q.empty()){
int u=q.top().pos;
q.pop();
if(judge[u]) continue;
judge[u]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to,w=e[i].w,l=cost[v];
if(l>mid) continue;
maxcost=max(maxcost,l);
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!judge[v]){
q.push((node){v,w});
}
}
}
}
}
int main(){
n=read();m=read();b=read();
ans=inf;
for(int i=1;i<=n;i++){
fa[i]=i;
cost[i]=read();
}
for(int i=1,x,y,z;i<=m;i++){
x=read();y=read();z=read();
addedge(x,y,z);
addedge(y,x,z);
fa[find(x)]=find(y);
}
if(fa[find(1)]!=fa[find(n)]){
printf("AFK");
return 0;
}
int l=0,r=inf;
while(l<=r){
mid=(l+r)>>1;
maxcost=0;
for(int i=1;i<=n;i++){
dis[i]=inf;
judge[i]=0;
}
dij();
if(dis[n]>b){
l=mid+1;
}
else{
r=mid-1;
ans=min(ans,maxcost);
}
}
printf("%d",ans);
return 0;
}
我的思路大概就是二分+dijkstra,但是不知道咋有三个点炸了。 https://www.luogu.org/problem/P1462
by Nelson @ 2019-09-29 21:09:22
@辰星凌 开了之后好像没有什么改变呢 [ : >
by Nelson @ 2019-09-29 21:10:23
啊我知道为什么了,我那个判无解的地方没有搞好呢 此贴终结。
by Nelson @ 2019-09-29 21:10:34
谢谢各位
by Nelson @ 2019-09-29 21:15:44
虽然不知道错在哪,但最后特判了一下答案没找到的情况(=inf),输出AFK就过了。 也许是并查集写的有问题。
by 辰星凌 @ 2019-09-29 21:15:53
@Nelson 突然意识到我之前开