NOIP2013 lorry transport.
Notice that the DIS does not press the right side.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#defineMAXV 15050#defineMaxe 600500using namespacestd;structregis{intU,v,w;} R[maxe];structedge{intV,W,NXT;} E[maxe];intN,m,k,g[maxv],x,y,z,nume=0, FATHER[MAXV];intanc[maxv][ -],mx[maxv][ -],DIS[MAXV];BOOLcmp (Regis X,regis y) {returnx.w<Y.W;}intGetfather (intx) { if(x!=father[x]) father[x]=Getfather (father[x]); returnfather[x];}voidAddedge (intUintVintW) {e[++nume].v=v; E[NUME].W=W; E[NUME].NXT=G[u]; G[u]=Nume;}voidKruskal () {sort (R+1, r+m+1, CMP); for(intI=1; i<=m;i++) { intu=r[i].u,v=r[i].v,w=R[I].W; intF1=getfather (u), f2=Getfather (v); if(f1!=F2) {Addedge (u,v,w); Addedge (V,U,W); FATHER[F1]=F2; } }}voidDfsintXintfather) {anc[x][0]=father; for(intI=g[x];i;i=e[i].nxt) { intv=e[i].v; if(v!=father) {mx[v][0]=E[I].W; DIS[V]=dis[x]+1; DFS (V,X); } }}intLcaintXinty) { if(dis[x]>Dis[y]) swap (x, y); for(intI= +; i>=0; i--) { if((Dis[anc[y][i]]>=dis[x]) && (anc[y][i]!=0)) Y=Anc[y][i]; } for(intI= +; i>=0; i--) { if(anc[x][i]!=Anc[y][i]) {x=Anc[x][i]; Y=Anc[y][i]; } } if(x==y)returnx; Else returnanc[x][0];}voidWork () {scanf ("%d%d",&x,&y); intR=lca (x, y), maxnum=0; if(x!=r) { for(intI= +; i>=0; i--) { if((Dis[anc[x][i]]>=dis[r]) && (anc[x][i]!=0) ) {Maxnum=Max (maxnum,mx[x][i]); X=Anc[x][i]; } } } if(y!=r) { for(intI= +; i>=0; i--) { if((Dis[anc[y][i]]>=dis[r]) && (anc[y][i]!=0) ) {Maxnum=Max (maxnum,mx[y][i]); Y=Anc[y][i]; }}} printf ("%d\n", Maxnum);}intMain () {scanf ("%d%d%d",&n,&m,&k); for(intI=1; i<=m;i++) scanf ("%d%d%d",&r[i].u,&r[i].v,&R[I].W); for(intI=1; i<=n;i++) father[i]=i; Kruskal (); DFS (1,0); for(intE=1; e<= +; e++) for(intI=1; i<=n;i++) {Anc[i][e]=anc[anc[i][e-1]][e-1]; Mx[i][e]=max (mx[i][e-1],mx[anc[i][e-1]][e-1]); } for(intI=1; i<=k;i++) work (); return 0;}
Bzoj 3732 Network