司徒stuart @ 2017-09-22 20:32:44
···
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
long long n,m,b;
int vis[10010];
long long f[10010],viss[10010],ans,fmax,bl[10010];
struct cost{
int id;
long long w;
};cost blood;
queue<int> q;
vector<cost> g[10010];
int relax(int x,int y)
{
if(bl[g[x][y].id]>bl[x]+g[x][y].w)
{
bl[g[x][y].id]=bl[x]+g[x][y].w;
return true;
}
else return false;
}
int spfa(long long x)
{
memset(bl,0x3f3f3f,sizeof(bl));
memset(vis,1,sizeof(vis));
bl[1]=0;q.push(1);vis[1]=false;
if(fmax>x)
{
return false;
}
while(!q.empty())
{
int v=q.front();q.pop();vis[v]=true;
for(int i=0;i<g[v].size();i++)
{
if(relax(v,i)&&vis[g[v][i].id]&&f[g[v][i].id]<=x)//松弛成功且下一个点不在队列中
{
q.push(g[v][i].id);
vis[g[v][i].id]=false;
ans=max(ans,f[g[v][i].id]);
}
}
}
if(bl[n]>=b) return false;
else return true;
}
int main()
{
long long ai,bi,ci,r=0,l=0;
cin>>n>>m>>b;
for(int i=1;i<=n;i++)
{
cin>>f[i];
r=max(r,f[i]);
}
fmax=max(f[1],f[n]);
for(int i=0;i<m;i++)
{
cin>>ai>>bi>>ci;
if(ai==bi) continue;
blood.id=bi;
blood.w=ci;
g[ai].push_back(blood);
blood.id=ai;
g[bi].push_back(blood);
}
if(!spfa(1000000001))
{
cout<<"AFK";
return 0;
}
while(l<=r)
{
ans=fmax;
int m=(l+r)/2;
if(spfa(m)) r=m-1;
else l=m+1;
}
cout<<ans;
return 0;
}
···