
完整代码:
#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define mp make_pair
#define fst first
#define snd second
#define pb push_back
#define inf 1e18
using namespace std;
const int N=1e5+50;
int n,m,vis1[N],vis2[N],dep[N],dis[50][N],dist[N],book[N],f[N][20],cnt,node[100],Q;
vector<PII>e[N],tree[N];
PII edge[N];
map<PII,int>p;
queue<int>q;
priority_queue<PII,vector< PII >,greater< PII > >qq;
inline void Dij(int id,int xx){
for(int i=1;i<=n;i++){
dis[id][i]=inf;
book[i]=0;
}
qq.push(mp(0,xx));
dis[id][xx]=0;
while(!qq.empty()){
int x=qq.top().snd;
qq.pop();
if(book[x]) continue;
book[x]=1;
for(auto i:e[x]){
if(dis[id][x]+i.snd<dis[id][i.fst]){
dis[id][i.fst]=dis[id][x]+i.snd;
qq.push(mp(dis[id][i.fst],i.fst));
}
}
}
}
inline void doLCA(int root){
int t=(int)log2(n)+1;
q.push(root);
dep[root]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(auto i:tree[x]){
int to=i.fst,we=i.snd;
dep[to]=dep[x]+1;
dist[to]=dist[x]+we;
f[to][0]=x;
for(int j=1;j<=t;j++) f[to][j]=f[f[to][j-1]][j-1];
}
}
}
inline int getLCA(int x,int y){
int t=(int)log2(n)+1;
if(dep[x]>dep[y]) swap(x,y);
for(int i=t;i>=0;i--) if(dep[f[y][i]]>=dep[x]) y=f[y][i];
if(x==y) return x;
for(int i=t;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
inline int distLCA(int x,int y){
return dist[x]+dist[y]-2*dist[getLCA(x,y)];
}
signed main(){
freopen("shortway.in","r",stdin);
freopen("shortway.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(int i=1,u,v,w;i<=m;i++){
scanf("%lld%lld%lld",&u,&v,&w);
e[u].pb(mp(v,w));
e[v].pb(mp(u,w));
edge[i]=mp(u,v);
p[mp(u,v)]=p[mp(u,v)]=i;
}
q.push(1);
vis1[1]=1;
while(!q.empty()){
int x=q.front();
q.pop();
for(auto i:e[x]){
if(!vis1[i.fst]){
tree[x].push_back(mp(i.fst,i.snd));
vis2[p[mp(x,i.fst)]]=1;
vis1[i.fst]=1;
q.push(i.fst);
}
}
}
doLCA(1);
for(int i=1;i<=m;i++){
if(!vis2[i]){
node[++cnt]=edge[i].fst;
node[++cnt]=edge[i].snd;
}
}
for(int i=1;i<=cnt;i++) Dij(i,node[i]);
scanf("%lld",&Q);
while(Q--){
int x,y;
scanf("%lld%lld",&x,&y);
int minn=distLCA(x,y);
for(int i=1;i<=cnt;i++) minn=min(minn,dis[i][x]+dis[i][y]);
printf("%lld\n",minn);
}
}
可能是什么原因?