TAIshine @ 2019-11-14 20:14:48
又是一个大力的夜晚,我的大力键盘被我大力敲打, 终于大力写完了这道大力题。
当我大力提交的时候,眼前大力地出现了一个WA,是第八个大力点。
在我无力地反复提交下,无力的情况没有一点大力的好转。
无奈,我无力地找到了第一篇题解,并提交了上去。
震惊!!!
居然同样WA了第八个点。
代码如下,蒟蒻在线大力等,急!
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#define N 20010
#define M 50005
#define V 0x7fffffff-1000000001
#define ll long long
using namespace std;
struct edge{ll ne,to,dis;}e[4*M];
ll mx,mn=V,ans=V;
ll a,b,c,p,n,m,mid,Hp,u;
ll good[N*2],h[3*M],flag[N*2],pan[N*2],ts[N*2],t[N*2];
priority_queue<int,vector<int >,greater<int > >que;
void qxx(ll from,ll to,ll dis){
e[++p].ne=h[from];
e[p].to=to;
e[p].dis=dis;
h[from]=p;
}
int pass(ll biao ){
if(biao<good[1]||biao<good[n])return 0;
for(int i=1;i<=n;i++){if(good[i]>biao)pan[i]=1;t[i]=V;}
t[1]=0;
que.push(1);
while(que.empty()==0){
u=que.top();
que.pop();
if(pan[u]==1)continue;
pan[u]=1;
for(int i=h[u];i;i=e[i].ne){
if(t[e[i].to]>t[u]+e[i].dis)
{t[e[i].to]=t[u]+e[i].dis;
que.push(e[i].to);}
}
}
if(t[n]>Hp)return 0;
else return 1;
}
int main()
{
cin>>n>>m>>Hp;
for(int i=1;i<=n;i++)cin>>good[i],ts[i]=good[i];
for(int i=1;i<=m;i++){cin>>a>>b>>c;qxx(a,b,c);qxx(b,a,c);}
sort(ts+1,ts+1+n);
if(pass(ts[n])==0){cout<<"AFK";return 0;}
memset(pan,0,sizeof(pan));
mn=1; mx=n;
while(mn<mx){
int mid=(mn+mx)>>1;
if(pass(ts[mid]))mx=mid;
else mn=mid+1;
memset(pan,0,sizeof(pan));
}
cout<<ts[mn];
return 0;
}
by George1123 @ 2019-11-14 20:16:03
@TAIshine 试试我的那篇题解
by 江山_远方 @ 2019-11-14 20:26:25
大力好评