codevs 3336 电话网络

时间:2023-03-08 17:40:59
codevs  3336 电话网络
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxn 20010
using namespace std;
int n,m,k,num,f[maxn],head[maxn],dis[maxn];
struct node
{
int u,v,t,pre;
}e[maxn];
int init()
{
int x=;char s=getchar();bool f=;
while(s<''||s>''){if(s=='-')f=;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
if(f)return -x;return x;
}
void Add(int from,int to,int dis)
{
num++;
e[num].u=from;
e[num].v=to;
e[num].t=dis;
e[num].pre=head[from];
head[from]=num;
}
void SPFA(int s)
{
queue<int>q;
dis[]=;
f[]=;
q.push();
while(!q.empty())
{
int p=q.front();
q.pop();
f[p]=;
for(int i=head[p];i;i=e[i].pre)
{
int si;
if(e[i].t<=s)si=;else si=;
if(dis[e[i].v]>dis[p]+si)
{
dis[e[i].v]=dis[p]+si;
if(f[e[i].v]==)
{
q.push(e[i].v);
f[e[i].v]=;
}
}
}
}
}
int main()
{
n=init();m=init();k=init(); int x,y,z;
for(int i=;i<=m;i++)
{
x=init();y=init();z=init();
Add(x,y,z);
Add(y,x,z);
}
int l=,r=,ans=-;
while(l<=r)
{
memset(f,,sizeof(f));
memset(dis,/,sizeof(dis));
int mid=(l+r)/;
SPFA(mid);
if(dis[n]<=k)
{
ans=mid;
r=mid-;
}
else l=mid+;
}
printf("%d\n",ans);
return ;
}