这个题其实就是LCA的模板题。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<vector> using namespace std; const int maxn=1e5; const int maxm=5e5; int e,head[maxn],nxt[maxm],pnt[maxm],cost[maxm],p[maxn],dist[maxn]; int n,m,k,ans[maxn]; vector<pair<int,int> > query[maxn]; bool vis[maxn]; void AddEdge(int u,int v,int c) { pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++; } void Init() { for(int i=1;i<=n;i++) query[i].clear(); } int find(int x) { if(p[x]==x) return x; return p[x]=find(p[x]); } void LCA(int u,int fa) { p[u]=u; for(int i=head[u];i!=-1;i=nxt[i]) { if(pnt[i]==fa) continue; dist[pnt[i]]=dist[u]+cost[i]; LCA(pnt[i],u); p[pnt[i]]=u; } vis[u]=1; for(int i=0;i<query[u].size();i++) { int v=query[u][i].first; if(vis[v]) ans[query[u][i].second]=dist[u]+dist[v]-2*dist[find(v)]; } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { Init(); e=0; memset(head,-1,sizeof(head)); for(int i=0;i<m;i++) { int u,v,c; char str[5]; scanf("%d%d%d%s",&u,&v,&c,str); AddEdge(u,v,c); AddEdge(v,u,c); } scanf("%d",&k); for(int i=0;i<k;i++) { int u,v; scanf("%d%d",&u,&v); query[u].push_back(make_pair(v,i)); query[v].push_back(make_pair(u,i)); } LCA(1,-1); for(int i=0;i<k;i++) printf("%d\n",ans[i]); } return 0; }