1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
#include <algorithm> #include <cstring> #include <queue> using namespace std; int dis[1100],u[11000<<1],v[11000<<1],w[11000<<1],n,p,k,fir[11000<<1],nxt[11000<<1],cnt; void (int ui,int vi,int wi){ ++cnt; u[cnt]=ui; v[cnt]=vi; w[cnt]=wi; nxt[cnt]=fir[ui]; fir[ui]=cnt; } bool check(int mid){ memset(dis,0x3f,sizeof(dis)); deque<int> q; q.push_back(1); dis[1]=0; while(!q.empty()){ int x=q.front(); q.pop_front(); for(int i=fir[x];i;i=nxt[i]){ if(dis[x]+(w[i]>mid)<dis[v[i]]){ dis[v[i]]=dis[x]+(w[i]>mid); if(w[i]>mid) q.push_back(v[i]); else q.push_front(v[i]); } } } return dis[n]<=k; } int main(){ scanf("%d %d %d",&n,&p,&k); for(int i=1;i<=p;i++){ int a,b,c; scanf("%d %d %d",&a,&b,&c); addedge(a,b,c); addedge(b,a,c); } int l=0,r=1000100,ans=-1; while(l<=r){ int mid=(l+r)>>1; if(check(mid)){ ans=mid; r=mid-1; } else l=mid+1; } printf("%d",ans); return 0; }
|
近期评论