也是求解LCA的模板题,最近才接触的,使用离线算法做的。
#pragma comment (linker, "/STACK:1024000000, 1024000000")
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 100010;
typedef pair <int, int> pii;
vector <pii> adj[MAX];
vector <pii> que[MAX];
int n,m,k;
char str[4];
bool vis[MAX] = {false};
int p[MAX],d[MAX],ans[MAX];
void init(){//邻接表的初始化
for(int i=0; i<=n; i++){
adj[i].clear();
que[i].clear();
}
}
int find(int x){//并查集的查找操作
if(x != p[x])
p[x] = find(p[x]);
return p[x];
}
void lca(int u, int fa){//离线算法求解LCA
p[u] = u;
for(int i=0; i<adj[u].size(); i++){
int v = adj[u][i].first;
if(v == fa) continue;
d[v] = d[u] + adj[u][i].second;
lca(v, u);
p[v] = u;
}
vis[u] = true;
for(int i=0; i<que[u].size(); i++){
int v = que[u][i].first;
if(vis[v])
ans[que[u][i].second] = d[u] + d[v] - 2*d[find(v)];
}
}
int main(){
scanf("%d%d",&n,&m);
init();
for(int i=0; i<m; i++){
int u,v,w;
scanf("%d%d%d%s",&u,&v,&w,str);
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
scanf("%d",&k);
for(int i=0; i<k; i++){
int u,v;
scanf("%d%d",&u,&v);
que[u].push_back(make_pair(v, i));
que[v].push_back(make_pair(u, i));
}
lca(1, 0);
for(int i=0; i<k; i++)
printf("%d\n",ans[i]);
return 0;
}