求助
查看原帖
求助
526518
respect_lowsmile楼主2022/10/6 18:01

程序一直输出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;
}
2022/10/6 18:01
加载中...