具体实现是用双端队列,0排在队头,1排在队尾,这样搜索的时候就会优先走0路
#include<bits/stdc++.h>
#include<queue>
using namespace std;
int n,p,k,maxn;
int head[10010],cnt;
int d[10010],vis[10010];
struct Edge{
int to;
int next;
int dis;
}e[20020];
void add_edge(int from,int to,int dis)
{
e[++cnt].to=to;
e[cnt].next=head[from];
e[cnt].dis=dis;
head[from]=cnt;
}
bool check(int x)
{
memset(d,0,sizeof d);
memset(vis,0,sizeof vis);
deque <int> q;
q.push_back(1);
d[1]=0;
vis[1]=1;
while(!q.empty())
{
int a=q.front();
q.pop_front();
for(register int i=head[a];i;i=e[i].next)
{
int y=e[i].to;
if(!vis[y] || d[y]>=d[a]+1)
if(e[i].dis<=x)
{
vis[y]=1;
q.push_front(y);
d[y]=d[a];
}
else
{
vis[y]=1;
q.push_back(y);
d[y]=d[a]+1;
}
}
}
if(d[n]>k)
return 0;
return 1;
}
int main()
{
scanf("%d%d%d",&n,&p,&k);
for(register int i=1;i<=p;i++)
{
int ai,bi,li;
scanf("%d%d%d",&ai,&bi,&li);
add_edge(ai,bi,li);
add_edge(bi,ai,li);
maxn=max(maxn,li);
}
int l=1,r=maxn;
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
if(l!=1)
printf("%d",l);
else
printf("-1");
}