#include using namespace std; void *wmem; template inline S max_L(S a,T b){ return a>=b?a:b; } inline void rd(int &x){ int k, m=0; x=0; for(;;){ k = getchar_unlocked(); if(k=='-'){ m=1; break; } if('0'<=k&&k<='9'){ x=k-'0'; break; } } for(;;){ k = getchar_unlocked(); if(k<'0'||k>'9'){ break; } x=x*10+k-'0'; } if(m){ x=-x; } } inline void rd(long long &x){ int k, m=0; x=0; for(;;){ k = getchar_unlocked(); if(k=='-'){ m=1; break; } if('0'<=k&&k<='9'){ x=k-'0'; break; } } for(;;){ k = getchar_unlocked(); if(k<'0'||k>'9'){ break; } x=x*10+k-'0'; } if(m){ x=-x; } } inline void wt_L(char a){ putchar_unlocked(a); } inline void wt_L(long long x){ char f[20]; int m=0, s=0; if(x<0){ m=1; x=-x; } while(x){ f[s++]=x%10; x/=10; } if(!s){ f[s++]=0; } if(m){ putchar_unlocked('-'); } while(s--){ putchar_unlocked(f[s]+'0'); } } template inline S chmax(S &a, T b){ if(a struct DijkstraHeap{ T *val; char *visited; int *hp, *place, size; void malloc(int N){ hp = (int*)std::malloc(N*sizeof(int)); place = (int*)std::malloc(N*sizeof(int)); visited = (char*)std::malloc(N*sizeof(char)); val = (T*)std::malloc(N*sizeof(T)); } void free(){ std::free(hp); std::free(place); std::free(visited); std::free(val); } void walloc(int N, void **mem=&wmem){ hp = (int*)(*mem); place = hp + N; visited = (char*)(place+N); val = (T*)(visited+N); *mem = val + N; } void init(int N){ int i; size = 0; for(i=0;i=size){ break; } if(m+1val[hp[m+1]]){ m++; } if(val[hp[m]]>=val[hp[n]]){ break; } swap(hp[m],hp[n]); swap(place[hp[m]],place[hp[n]]); n=m; } } void change(int n, T v){ if(visited[n]||(place[n]>=0&&val[n]<=v)){ return; } val[n]=v; if(place[n]==-1){ place[n]=size; hp[size++]=n; up(place[n]); } else{ up(place[n]); } } int pop(void){ int res=hp[0]; place[res]=-1; size--; if(size){ hp[0]=hp[size]; place[hp[0]]=0; down(0); } visited[res]=1; return res; } } ; struct graph{ int N, **edge, *es; void setEdge(int N__, int M, int A[], int B[], void **mem = &wmem){ int i; N = N__; es = (int*)(*mem); edge = (int**)(es+N); edge[0] = (int*)(edge+N); for(i=0;i *A; for(i=0;i*)((int*)((int**)(*mem) + tn) + tn + M); M = 0; for(i=0;i=0){ continue; } res[k]=res[i]+1; q[s+z++]=k; } } } inline int sccDFS(int num[], int st, int mx){ int i, j; num[st]=-2; for(i=0;i=0;k--){ i=nrv[k]; if(res[i]>=0){ continue; } res[i]=ret; st_size=0; st[st_size++]=i; while(st_size){ i=st[--st_size]; for(j=0;j num[w]){ rts--; } } } if(v == rt[rts-1]){ k = S[Ss-1]; for(;;){ int w=S[--Ss]; inS[w] = 0; res[w] = k; if(v==w){ break; } } rts--; } } int bcc(int res[], void *mem=wmem){ int *S, Ss=0, i, *inS, k, *num, *rt, rts=0, tm=0; pair *arr; num = (int*)mem; rt = num + N; S = rt + N; inS = S + N; memset(num, 0, sizeof(int)*N); memset(inS, 0, sizeof(int)*N); for(i=0;i*)mem; for(i=0;i struct wgraph{ T **cost; graph g; int N, **edge, *es; void setEdge(int N__, int M, int A[], int B[], T C[], void **mem = &wmem){ int i; N = N__; es = (int*)(*mem); for(i=0;i void getDist(int root, S res[], S unreachable = -1, void *mem = wmem){ DijkstraHeap hp; int i, j; hp.walloc(N, &mem); hp.init(N); hp.change(root,0); while(hp.size){ i = hp.pop(); for(j=0;j void getDistForest(int root, S res[], S unreachable = -1, void *mem = wmem){ char *r; int i, j, k, *q, s, z; q=(int*)mem; r=(char*)(q+N); for(i=0;i g; wmem = memarr; rd(N); rd(M); rd(P); rd(Q); rd(T); { int Lj4PdHRW; for(Lj4PdHRW=0;Lj4PdHRW T){ continue; } chmax(res, T - tmp); } } if(dist0[P] + distP[Q] + distQ[0] <= T){ res = T; } wt_L(res); wt_L('\n'); return 0; } // cLay varsion 20190630-1 // --- original code --- // int N, M, P, Q, T, A[1d5], B[1d5]; ll C[1d5]; // // ll dist0[2000], distP[2000], distQ[2000]; // // { // int i, j, k; // ll res, tmp, s; // wgraph g; // // rd(N,M,P,Q,T,(A,B,C)(M)); // P--; Q--; // rep(i,M) A[i]--, B[i]--; // // g.setEdge(N, M, A, B, C); // g.getDist(0, dist0); // g.getDist(P, distP); // g.getDist(Q, distQ); // // res = -1; // rep(i,N) rep(j,i,N){ // tmp = max(distP[i]+distP[j], distQ[i]+distQ[j]); // s = dist0[i] + tmp + dist0[j]; // if(s > T) continue; // res >?= T - tmp; // } // if(dist0[P] + distP[Q] + distQ[0] <= T) res = T; // // wt(res); // }