#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int Max=1e5+6;
const int N=31;
int n,m;
int fa[Max][N];
int deep[Max];
int cost[Max];
struct node{
int to,w;
}haha[Max];
vector<node>edge[Max];
void dfs(int u,int pre,int dis){
cost[u]=dis;
for(int i=0;i<edge[u].size();i++){
int v=edge[u][i].to;
int w=edge[u][i].w;
if(v==pre){
continue;
}
fa[v][0]=u;
deep[v]=deep[u]+1;
dfs(v,u,dis+w);
}
}
void bz(){
for(int j=1;j<N;j++){
for(int i=1;i<=n;i++){
fa[i][j]=fa[fa[i][j-1]][j-1];
}
}
}
int lca(int u,int v){
if(deep[u]<deep[v]){
swap(u,v);
}
int dc=deep[u]-deep[v];
for(int i=0;i<N;i++){
if((1<<i)&dc){
u=fa[u][i];
}
}
if(u==v){
return u;
}
for(int i=N-1;i>=0;i--){
if(fa[u][i]!=fa[v][i]){
u=fa[u][i];
v=fa[v][i];
}
}
u=fa[u][0];
return u;
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n>>m){
memset(cost,0,sizeof(cost));
memset(deep,0,sizeof(deep));
for(int i=1;i<=n;i++){
edge[i].clear();
}
int u,v,w;
char c;
while(m--){
cin>>u>>v>>w>>c;
edge[u].push_back(node{v,w});
edge[v].push_back(node{u,w});
}
dfs(1,-1,0);
bz();
int q;
cin>>q;
while(q--){
cin>>u>>v;
cout<<cost[u]+cost[v]-2*cost[lca(u,v)]<<endl;
}
}
return 0;
}
模板积累——LCA求最近公共祖先(树形图最短路)
最新推荐文章于 2023-01-06 23:03:23 发布