明明和题解没啥区别却总是 WA,求大佬帮忙看看是哪里出了问题
#include<bits/stdc++.h>
using namespace std;
struct edge{
long long to,val;
edge(long long b=0,long long c=0){
to=b;val=c;
}
};
struct edge2{
long long from,to,val;
edge2(long long a=0,long long b=0,long long c=0){
from=a;to=b;val=c;
}
};
bool operator < (edge l,edge r){
return l.val > r.val;
}
bool cmp(edge2 l,edge2 r){
return l.val < r.val;
}
long long n,m,k,q,lena,dis[500005],deep[500005],f[500005],fa[500005][30],g[500005][30];
bool vis[500005];
edge2 a[500005];
vector<edge> v[500005],v2[500005];
long long find(long long x){
if(f[x] != x)
return f[x] = find(f[x]);
return x;
}
void dij(long long s){
memset(vis,0,sizeof(vis));
memset(dis,0x3f3f3f3f,sizeof(dis));
priority_queue<edge> q;
q.push(edge(s,0));
dis[s]=0;
while(!q.empty()){
long long from=q.top().to;
q.pop();
if(vis[from])
continue;
vis[from]=1;
for(long long i=0; i<v[from].size(); i++){
long long to=v[from][i].to,val=v[from][i].val;
if(vis[to])
continue;
if(dis[to] > dis[from] + val){
dis[to] = dis[from] + val;
q.push(edge(to,val));
}
}
}
}
void kruskal(){
for(int i=1; i<=n; i++){
f[i]=i;
}
sort(a+1,a+m+1,cmp);
// for(long long i=1; i<=lena; i++){
// printf("%d %d %d\n",a[i].from,a[i].to,a[i].val);
// }
// cout<<endl;
long long cnt=0;
for(long long i=1; i<=m && cnt!=(n-1); i++){
long long from=a[i].from,to=a[i].to;
long long o=find(from),u=find(to);
if(find(from) != find(to) && from!=0 && to!=0){
v2[from].push_back(edge(to,a[i].val));
v2[to].push_back(edge(from,a[i].val));
f[find(from)] = find(to);
cnt++;
}
}
}
void dfs(long long now,long long now_fa){
for(long long i=0; i<v2[now].size(); i++){
long long to=v2[now][i].to,val=v2[now][i].val;
if(to == now_fa)
continue;
fa[to][0]=now; //记录父亲
g[to][0]=val; //记录最大值最小的最大值
deep[to]=deep[now]+1;
// printf("%d %d\n",now,to);
dfs(to,now);
}
}
void chuli(){
for(long long i=1; i<=25; i++){
for(long long j=1; j<=n; j++){
fa[j][i] = fa[fa[j][i-1]][i-1];
g[j][i] = max(g[j][i-1],g[fa[j][i-1]][i-1]);
}
}
}
long long get_ans(long long x,long long y){
long long cnt=-1e18;
if(deep[x] > deep[y])
swap(x,y);
for(long long i=25; i>=0; i--){
if(deep[fa[y][i]] >= deep[x]){
cnt=max(cnt,g[y][i]);
y=fa[y][i];
}
}
if(x == y)
return cnt;
for(long long i=25; i>=0; i--){
if(fa[x][i] != fa[y][i]){
cnt=max(cnt,max(g[x][i],g[y][i]));
x=fa[x][i];
y=fa[y][i];
}
}
return max(cnt,max(g[y][0],g[x][0]));
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
cin>>n>>m>>k>>q;
for(long long i=1; i<=m; i++){
long long from,to,val;
cin>>from>>to>>val;
v[from].push_back(edge(to,val));
v[to].push_back(edge(from,val));
a[i].from=from;a[i].to=to;a[i].val=val;
}
for(long long i=1; i<=k; i++){
v[0].push_back(edge(i,0));
v[i].push_back(edge(0,0));
}
for(long long i=1; i<=n; i++)
f[i]=i;
dij(0);
for(int i=1; i<=m; i++){
a[i].val+=dis[a[i].from] + dis[a[i].to];
}
kruskal();
deep[1]=1;
dfs(1,-1);
chuli();
for(long long i=1; i<=q; i++){
long long from,to;
cin>>from>>to;
long long ans=get_ans(from,to);
cout<<ans<<endl;
}
return 0;
}