這個題其實就是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;
}