Topic links
To n cities, M Edge, q query, each query, output city A and b the shortest distance, if not unicom, output not connected.
Use and check the set to find the Unicom, if not connected, then two unicom block between a large weight of the side. Then the tree chain splits ...
#include <iostream>#include<vector>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<map>#include<Set>#include<string>#include<queue>#include<stack>#include<bitset>using namespacestd;#definePB (x) push_back (x)#definell Long Long#defineMK (x, y) make_pair (x, y)#defineLson L, M, rt<<1#defineMem (a) memset (a, 0, sizeof (a))#defineRson m+1, R, rt<<1|1#defineMem1 (a) memset (a,-1, sizeof (a))#defineMEM2 (a) memset (a, 0x3f, sizeof (a))#defineRep (i, N, a) for (int i = A; i<n; i++)#defineFi first#defineSe Secondtypedef pair<int,int>PLL;Const DoublePI = ACOs (-1.0);Const DoubleEPS = 1e-8;Const intMoD = 1e9+7;Const intINF =1061109567;Const intdir[][2] = { {-1,0}, {1,0}, {0, -1}, {0,1} };Const intMAXN =10005;inthead[maxn*2], FA[MAXN], SON[MAXN], SZ[MAXN], DEEP[MAXN], TOP[MAXN], W[MAXN], F[MAXN], CNT, num;ll SUM[MAXN<<2];structnode{intto, Nextt, W;} E[MAXN*2];structed{intu, v; ll W; Ed () {} ed (intUintV, ll W): U (U), V (v), W (w) {}}EDGE[MAXN];voidinit () {mem1 (head); Num= CNT =0;}voidAddintUintVintW) {e[num].to= V, e[num].nextt = head[u], E[NUM].W = W, head[u] = num++;}voidDFS1 (intUintFA) {Sz[u]=1; Deep[u]= deep[fa]+1; Son[u]= -1; F[u]=FA; for(inti = Head[u]; ~i; i =e[i].nextt) { intv =e[i].to; if(v = =FA)Continue; DFS1 (V, u); Sz[u]+=Sz[v]; if(son[u]==-1|| Sz[v]>Sz[son[u]]) Son[u]=v; }}voidDFS2 (intUintTP) {W[u]= ++cnt, Top[u] =TP; if(~Son[u]) DFS2 (Son[u], TP); for(inti = Head[u]; ~i; i =e[i].nextt) { intv =e[i].to; if(v = = f[u]| | v = =Son[u])Continue; DFS2 (V, v); }}voidPushup (intRT) {Sum[rt]= sum[rt<<1]+sum[rt<<1|1];}voidUpdateintP, LL Val,intLintRintRT) { if(L = =R) {Sum[rt]=Val; return ; } intm = l+r>>1; if(p<=m) Update (p, Val, Lson); ElseUpdate (P, Val, Rson); Pushup (RT);} ll query (intLintRintLintRintRT) { if(l<=l&&r>=r) {returnSum[rt]; } intm = l+r>>1; LL ret=0; if(l<=m) Ret+=query (L, R, Lson); if(r>m) Ret+=query (L, R, Rson); returnret;} ll find (intUintv) {intF1 = Top[u], F2 =Top[v]; LL ret=0; while(F1! =F2) { if(deep[f1]<Deep[f2]) {Swap (f1, F2); Swap (U, v); } ret+ = Query (W[f1], W[u],1Cnt1); U=F[F1]; F1=Top[u]; } if(U = =v)returnret; if(deep[u]>Deep[v]) Swap (U, v); RET+ = Query (W[son[u], w[v],1Cnt1); returnret;}intFINDD (intu) {returnFa[u] = = u?u:findd (Fa[u]);}intMain () {intN, M, q, x, Y, Z; while(cin>>n>>m>>q) {init (); intECNT =0; for(inti =1; i<=n; i++) Fa[i]=i; for(inti =0; i<m; i++) {scanf ("%d%d%d", &x, &y, &z); Add (x, y, z); Add (y, x, z); Edge[ecnt++] =Ed (x, Y, z); X=findd (x); Y=findd (y); if(x!=y) fa[x]=y; } x= Findd (1); for(inti =2; i<=n; i++) {y=findd (i); if(y!=x) {Fa[y]=x; Edge[ecnt++] =Ed (x, Y, (LL) 1e12); Add (x, y, INF); Add (y, x, INF); }} DFS1 (1,0); DFS2 (1,1); for(inti =0; i<ecnt; i++) { if(deep[edge[i].u]>DEEP[EDGE[I].V]) {Swap (edge[i].u, EDGE[I].V); } update (W[EDGE[I].V], EDGE[I].W,1Cnt1); } while(q--) {scanf ("%d%d", &x, &y); ll ans=find (x, y); if(ans>=1e12) {puts ("Not connected"); } Else{printf ("%d\n", ans); } } } return 0;}
Hdu 2874Connections between Cities LCA