xun0 @ 2018-08-19 16:26:38
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
const long long int maxn=100000000000;
long long int f[10001],b,d[100001],ans;
int n,m,cnt,last[10001],vst[10001],pre[10001];
struct edge
{
long long int c;
int next;
int to;
}a[100001];
void read();
void addedge(int x,int y,int z);
void spfa(int v);
void road(int v);
int main()
{
freopen("a.in","r",stdin);
read();
for (int i=1;i<=n;++i)
{
d[i]=maxn;
vst[i]=0;
}
spfa(1);
if (d[n]>=b)
{
cout<<"AFK";
return 0;
}
ans=f[1];
road(n);
cout<<ans<<endl;
return 0;
}
void road(int v)
{
if (pre[v]!=1) road(pre[v]);
ans=max(ans,f[v]);
return;
}
void spfa(int v)
{
queue<int> q;
q.push(v);
vst[v]=1;d[v]=0;
while (!q.empty())
{
int k=q.front();
q.pop();
vst[k]=0;
for (int i=last[k];i>0;i=a[i].next)
{
if (d[a[i].to]>d[k]+a[i].c)
{
d[a[i].to]=d[k]+a[i].c;
if (!vst[a[i].to])
{
vst[a[i].to]=1;
pre[a[i].to]=k;
q.push(a[i].to);
}
}
}
}
return;
}
void read()
{
cin>>n>>m>>b;
for (int i=1;i<=n;++i) cin>>f[i];
cnt=0;
for (int i=1;i<=n;++i)
{
last[i]=0;
}
for (int i=1,x,y,z;i<=m;++i)
{
cin>>x>>y>>z;
addedge(x,y,z);
}
}
void addedge(int x,int y,int z)
{
cnt++;
a[cnt].c=z;
a[cnt].to=y;
a[cnt].next=last[x];
last[x]=cnt;
++cnt;
a[cnt].c=z;
a[cnt].to=x;
a[cnt].next=last[y];
last[y]=cnt;
return;
}
不是很理解为什么二分,我把路径记录下来,然后在路径中找费用最大的点。可以过五组数据,求大佬救救我啊,蒟蒻都不会二分了
by lsroi @ 2018-08-23 17:16:44
@xun0 题目是要求使经过城市的最大花费最小,所以要二分,二分最小的花费是多少。然后在你写最短路时,如果有某个城市的花费大于你所二分的那个花费,那就不能经过该城市。