第三个点错了
#include<bits/stdc++.h>
#define M 200001
#define inf 1e16
#define ll long long
using namespace std;
inline ll read()
{
ll k=0,f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
return f?-k:k;
}
ll n,m,Q,cnt,h[M];
ll fa[M][21],dep[M],dis[M];/*最小生成树*/
ll f[M],vis[M];/*并查集*/
ll Dis[45][M],idx[M],flag[M],num;/*最短路径*/
struct edge
{
ll to,ne,val;
ll a,b,c,d;
}e[M<<1]/*树边*/,g[M<<1]/*求最小生成树*/;
struct node
{
ll idx,val;
};
inline bool operator <(const node &x,const node &y)
{
return x.val>y.val;
}
vector<node> q_edge[M];/*存原图边,用于最短路*/
inline void add(ll u,ll v,ll val)
{
cnt++;
e[cnt].to=v,e[cnt].ne=h[u],e[cnt].val=val,h[u]=cnt;
}
inline bool cmp(edge x,edge y)
{
return x.c<y.c;
}
inline ll find(ll x)
{
if(x!=f[x]) f[x]=find(f[x]);
return f[x];
}
inline void kruskal()
{
sort(g+1,g+m+1,cmp);
for(ll i=1;i<=n;i++) f[i]=i;
ll sum=0;
for(ll i=1;i<=m;i++)
{
ll fx=find(g[i].a),fy=find(g[i].b);
if(fx!=fy)
{
f[fx]=fy,sum++,vis[g[i].d]=1,add(g[i].a,g[i].b,g[i].c),add(g[i].b,g[i].a,g[i].c);
if(sum==n-1) return;
}
}
}
inline void dfs(ll x,ll father,ll j)
{
fa[x][0]=father,dep[x]=dep[father]+1,dis[x]=dis[father]+e[j].val;
for(ll i=h[x];i;i=e[i].ne)
{
ll y=e[i].to;
if(y!=fa[x][0]) dfs(y,x,i);
}
}
inline void dijkstra(ll s)
{
priority_queue<node> q;
for(ll i=1;i<=n;i++) Dis[num][i]=inf,flag[i]=0;
Dis[num][s]=0,q.push({s,Dis[num][s]});
while(!q.empty())
{
node t=q.top();
q.pop();
if(flag[t.idx]) continue;
flag[t.idx]=1;
for(ll i=0;i<q_edge[t.idx].size();i++)
{
ll y=q_edge[t.idx][i].idx;
if(Dis[num][y]>Dis[num][t.idx]+q_edge[t.idx][i].val) Dis[num][y]=Dis[num][t.idx]+q_edge[t.idx][i].val,q.push({y,Dis[num][y]});
}
}
}
inline void pre()
{
for(ll j=1;j<=20;j++)
for(ll i=1;i<=n;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
for(ll i=1;i<=m;i++)
if(!vis[i])
{
if(!idx[g[i].a]) num++,idx[g[i].a]=num,dijkstra(g[i].a);
if(!idx[g[i].b]) num++,idx[g[i].b]=num,dijkstra(g[i].b);
}
}
inline ll LCA(ll x,ll y)
{
if(dep[x]<dep[y]) swap(x,y);
for(ll i=20;i>=0;i--)
if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
if(x==y) return x;
for(ll i=20;i>=0;i--)
if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int main()
{
n=read(),m=read();
for(ll i=1;i<=m;i++) g[i].a=read(),g[i].b=read(),g[i].c=read(),g[i].d=i,q_edge[g[i].a].push_back({g[i].b,g[i].c}),q_edge[g[i].b].push_back({g[i].a,g[i].c});
kruskal(),dfs(1,0,0),pre(),Q=read();
while(Q--)
{
ll x=read(),y=read(),lca=LCA(x,y),ans=dis[x]+dis[y]-2*dis[lca];
for(ll i=1;i<=num;i++) ans=min(ans,Dis[i][x]+Dis[i][y]);
printf("%lld\n",ans);
}
return 0;
}```