WA 0 求调,样例已过!
  • 板块P2245 星际导航
  • 楼主husy
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/9/7 13:24
  • 上次更新2023/10/27 12:21:41
查看原帖
WA 0 求调,样例已过!
484780
husy楼主2022/9/7 13:24
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dis[300010][20],ver[1000010],nex[1000010],head[100010],tot;
int f[100010][20],dep[100010],fa[100010],edge[100010],vis[1000010];
int n,m,q;
struct node
{
	int x,y,z;
}a[3000010];
void init()
{
	for(int j=1;j<=20;j++)
	for(int i=1;i<=n;i++)
	{
		f[i][j]=f[f[i][j-1]][j-1];
		dis[i][j]=max(dis[i][j-1],dis[f[i][j-1]][j-1]);
	}
	return ;
}
void add(int x,int y,int z)
{
	ver[++tot]=y,nex[tot]=head[x],edge[tot]=z,head[x]=tot;
}
bool cmp(node a,node b)
{
	return a.z<b.z;
}
int get(int x)
{
	if(x==fa[x])return x;
	return fa[x]=get(fa[x]);
}
int lca(int x,int y)
{
	if(get(x)!=get(y))return -1;
	int ans=0;
	if(dep[x]<dep[y])swap(x,y);
	for(int i=20;i>=0;i--)if(f[x][i]&&dep[f[x][i]]>=dep[y])ans=max(ans,dis[x][i]),x=f[x][i];
	if(x==y)return ans;
	for(int i=20;i>=0;i--)if(f[x][i]&&f[y][i]&&f[x][i]!=f[y][i])ans=max(ans,max(dis[x][i],dis[y][i])),x=f[x][i],y=f[y][i];
	ans=max(ans,max(dis[x][0],dis[y][0]));
	return ans;
}
void MST()
{
	int cnt=0;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int xx=get(a[i].x),yy=get(a[i].y);
		if(xx==yy)continue;
		add(a[i].x,a[i].y,a[i].z);
		add(a[i].y,a[i].x,a[i].z);
		fa[xx]=yy;
		cnt++;
		if(cnt==n-1)break;
	}
}
void dfs(int x)
{
	vis[x]=1;
	for(int i=head[x];i;i=nex[i])
	{
		int y=ver[i];
		if(vis[y])continue;
		dep[y]=dep[x]+1;
		f[y][0]=x;
		dis[y][0]=edge[i];
		dfs(y);
	}
}

signed main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++)
	scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
	MST();
	dfs(1);
	init();
	scanf("%lld",&q);
	while(q--)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		int l=lca(x,y);
		if(l==-1)puts("impossible");
		else printf("%lld\n",l);
	}
	return 0;
}
2022/9/7 13:24
加载中...