扔下链接和代码就跑http://immortalco.blog.uoj.ac/blog/1955
#include<bits/stdc++.h> using namespace std; const int maxn=1e4+1e4+233; const int BIT=18; int n,m,q; struct edge{ int u,v,w; bool operator==(edge oth)const{ return u==oth.u && v==oth.v && w==oth.w; } bool operator!=(edge oth)const{ return !(*this==oth); } }; vector<edge>G[maxn],T[maxn]; int dfn[maxn],low[maxn],tot,rlen[maxn]; bool ins[maxn]; stack<edge>S; int Rcnt=0; vector<edge>ring[maxn]; vector<int>bel[maxn],sum[maxn],dis[maxn]; int fa[maxn][BIT]; int dep[maxn],dep2[maxn],fw[maxn]; vector<pair<int,int> >ind[maxn]; map<pair<int,int>,int>Mw; pair<int,int>pack(int a,int b){ if(a>b)swap(a,b); return make_pair(a,b); } void tarjan(int u){ dfn[u]=low[u]=++tot; for(int i=0;i<G[u].size();i++){ edge e=G[u][i]; if(dfn[e.v]) low[u]=min(low[u],dfn[e.v]); else{ S.push(e); tarjan(e.v); if(low[e.v]==dfn[u]){ if(S.top()==e){ fa[e.v][0]=u; fw[e.v]=e.w; S.pop(); continue; } Rcnt++; edge ed; do{ ed=S.top();S.pop(); ring[Rcnt].push_back(ed); }while(ed!=e); reverse(ring[Rcnt].begin(),ring[Rcnt].end()); int last=ring[Rcnt].back().v; ring[Rcnt].push_back((edge){last,u,Mw[pack(last,u)]}); } low[u]=min(low[u],low[e.v]); } } } void up(int u){ if(dep[u]||u==1)return ; if(fa[u][0])up(fa[u][0]); dep[u]=dep[fa[u][0]]+1; fw[u]+=fw[fa[u][0]]; } void build(){ S.push((edge){0,1,0}); tarjan(1); for(int i=1;i<=Rcnt;i++){ rlen[i]=0; sum[i].resize(ring[i].size()); dis[i].resize(ring[i].size()); for(int j=0;j<ring[i].size();j++){ rlen[i]+=ring[i][j].w; ind[i].push_back(make_pair(ring[i][j].u,j)); } sum[i][0]=0; fw[i+n]=0; fa[i+n][0]=ring[i][0].u; for(int j=1;j<ring[i].size();j++){ sum[i][j]=sum[i][j-1]+ring[i][j-1].w; dis[i][j]=min(sum[i][j],rlen[i]-sum[i][j]); fw[ring[i][j].u]=dis[i][j]; fa[ring[i][j].u][0]=i+n; } sort(ind[i].begin(),ind[i].end()); } for(int i=1;i<=n+Rcnt;i++) up(i); for(int j=1;j<BIT;j++) for(int i=1;i<=n+Rcnt;i++)if(fa[i][j-1]) fa[i][j]=fa[fa[i][j-1]][j-1]; } pair<int,int>second_lca; int lca(int u,int v){ if(dep[u]<dep[v])swap(u,v); int d=dep[u]-dep[v]; for(int i=0;i<BIT;i++)if(d>>i&1) u=fa[u][i]; if(u==v)return u; for(int i=BIT-1;i>=0;i--)if(fa[u][i]!=fa[v][i]){ u=fa[u][i]; v=fa[v][i]; } second_lca=make_pair(u,v); return fa[u][0]; } int main(){ freopen("bzoj2125.in","r",stdin); scanf("%d%d%d",&n,&m,&q); for(int i=1;i<=m;i++){ int u,v,w;scanf("%d%d%d",&u,&v,&w); G[u].push_back((edge){u,v,w}); G[v].push_back((edge){v,u,w}); Mw[pack(u,v)]=w; } build(); while(q--){ int u,v; scanf("%d%d",&u,&v); int LCA=lca(u,v); if(LCA<=n)printf("%d\n",fw[u]+fw[v]-2*fw[LCA]); else{ if(dep[u]<dep[v])swap(u,v); int R=LCA-n; int uu=second_lca.first; int vv=second_lca.second; int ans=fw[u]-fw[uu]+fw[v]-fw[vv]; int uid,vid; uid=lower_bound(ind[R].begin(),ind[R].end(),make_pair(uu,-1))->second; vid=lower_bound(ind[R].begin(),ind[R].end(),make_pair(vv,-1))->second; ans+=min(abs(sum[R][uid]-sum[R][vid]),rlen[R]-abs(sum[R][uid]-sum[R][vid])); printf("%d\n",ans); } } return 0; }