程序一直输出0。。。。。。
自测dijkstra和kruskal没问题,应该是dfs和lca的问题。
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=3e5+5;
const int INF=0x3f3f3f3f;
struct node
{
int from,to,next,w;
};
struct Node
{
int id,w;
bool operator < (const Node &x) const
{
return x.w < w;
}
};
node edge[N<<1],E1[N<<1],E2[N<<1];
int head[N],dis[N],vis[N],fa[N],Head[N],deep[N],ST[N][20],lg[N],maxc[N][20];
int num,n,m,k,Q,Num;
priority_queue<Node> q;
int cmp(node a,node b)
{
return a.w<b.w;
}
void add(int u,int v,int w)
{
++num;
edge[num].from=u;
edge[num].to=v;
edge[num].next=head[u];
edge[num].w=w;
head[u]=num;
}
void Add(int u,int v,int w)
{
++Num;
E2[Num].from=u;
E2[Num].to=v;
E2[Num].w=w;
E2[Num].next=Head[u];
Head[u]=Num;
}
int findd(int x)
{
if(fa[x]==x) return fa[x];
else return fa[x]=findd(fa[x]);
}
void dij()
{
memset(dis,INF,sizeof(dis));
dis[0]=0;
q.push(Node{0,0});
while(!q.empty())
{
int now=q.top().id;
q.pop();
if(vis[now]) continue;
vis[now]=1;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to,w=edge[i].w;
if(dis[v]>dis[now]+w)
{
dis[v]=dis[now]+w;
if(!vis[v]) q.push(Node{v,dis[v]});
}
}
}
}
void kruskal()
{
int cnt=0;
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1;i<=m;++i)
{
if(findd(E1[i].from)!=findd(E1[i].to))
{
fa[findd(E1[i].to)]=findd(E1[i].from);
cnt++;
Add(E1[i].from,E1[i].to,E1[i].w);
Add(E1[i].to,E1[i].from,E1[i].w);
if(cnt==n-1) return ;
}
}
}
void dfs(int now,int fa,int val)
{
deep[now]=deep[fa]+1,ST[now][0]=fa,maxc[now][0]=val;
for(int i=1;i<=20;++i)
ST[now][i]=ST[ST[now][i-1]][i-1],
maxc[now][i]=max(maxc[now][i-1],maxc[ST[now][i-1]][i-1]);
for(int i=head[now];i;i=E2[i].next)
{
int v=E2[i].to,w=E2[i].w;
if(v==fa) continue;
dfs(v,now,w);
}
}
int LCA(int x,int y)
{
int res=0;
if(deep[x]<deep[y]) swap(x,y);
for(int i=20;i>=0;i--)
if(deep[ST[x][i]]>=deep[y]) res=max(res,maxc[x][i]),x=ST[x][i];
if(x==y) return res;
for(int i=lg[deep[x]];i>=0;--i)
if(ST[x][i]!=ST[y][i])
res=max(res,max(maxc[x][i],maxc[y][i])),x=ST[x][i],y=ST[y][i];
res=max(res,max(maxc[x][0],maxc[y][0]));
return res;
}
int main()
{
scanf("%d %d %d %d",&n,&m,&k,&Q);
for(int i=1;i<=m;++i)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
add(u,v,w),add(v,u,w);
E1[i].from=u,E1[i].to=v,E1[i].w=w;
}
for(int i=1;i<=k;++i)
add(0,i,0),add(i,0,0);
dij();
for(int i=1;i<=m;++i)
E1[i].w+=dis[E1[i].from]+dis[E1[i].to];
sort(E1+1,E1+1+m,cmp);
kruskal();
for(int i=1;i<=n;++i)
lg[i]=lg[i-1]+(1<< lg[i-1]==i);
dfs(1,0,0);
for(int i=1;i<=Q;++i)
{
int u,v;
scanf("%d %d",&u,&v);
printf("%d\n",LCA(u,v));
}
return 0;
}