luogu P4281 [AHOI2008] colección de emergencia / recolección | LCA

título Descripción

isla feliz tiene un muy divertido juego, llamada "colección de emergencia." Isla dispersa con n punto de espera, hay n-1 son conectadas a la carretera, las carreteras están conectados cada uno a uno de una espera de dos puntos, y se puede recorrer a través de todos estos puntos de ruta de espera a través de un camino de un punto a otro un punto para pasar una moneda.

Las personas participan en el trío de juego, principio, todo el personal está a la espera de cualquier dispersos en varios puntos (cada punto de tiempo que permite más de una persona de espera), cada persona con suficiente moneda del juego (a pagar por el uso de carreteras costos), mapas (conexiones viales entre el caso marcó el punto de espera) y la máquina de diálogo (para los miembros del grupo de contactos y con). Después de la recogida de la trompeta, el rápido enlace entre miembros de cada grupo, todos los grupos mismos comprender el punto de espera donde los miembros, determinar rápidamente un punto de reunión de espera en los N puntos, todos los miembros del grupo se encuentra en el punto de ajuste, la colección menos costosa con el equipo será el ganador del juego.

Pequeño cacao y sus amigos invitan a unirse al juego, para que elija el punto de ajuste, inteligente puede realizar esta tarea, para ayudar a pequeña cacao ganar el juego?

Formato de entrada

La primera línea de dos números enteros positivos n y m, cada punto representa el número de espera (punto de espera también numeradas de 1 a n) y un número determinado de ganadores necesidad de completar.

Entonces n-1 líneas de dos números enteros positivos a, b, y ese número es un número que existe un camino entre el punto de espera b.

Entonces m líneas, cada una con tres números enteros positivos x, y, z, representa un conjunto particular de cacao pequeño delante, cacao pequeño número de amigos, y en su punto de espera.

Formato de salida

líneas de salida total de M, cada línea separados por un espacio de dos enteros p, c. Donde i representa el punto de encuentro veces selección de la fila i-ésima en la espera para el número p, el costo total es una colección de moneda c juego.


La respuesta está ligada en un LCA en dos

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5e5+10;
int nxt[N<<1],head[N],go[N<<1],tot;
inline int read(){
	int x=0; char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while('0'<=c&&c<='9'){ x=(x<<1)+(x<<3)+c-'0'; c=getchar(); }
	return x;
}
inline void add(int u,int v){
	nxt[++tot]=head[u],head[u]=tot,go[tot]=v;
	nxt[++tot]=head[v],head[v]=tot,go[tot]=u;
}
int f[N][20],dep[N];
void Deal(int u,int fa){
	f[u][0]=fa,dep[u]=dep[fa]+1;
	for(int i=1;i<=19;i++)f[u][i]=f[f[u][i-1]][i-1];
	
	for(int i=head[u];i;i=nxt[i]){
		int v=go[i];
		if(v==fa)continue;
		Deal(v,u);
	}
	
}
inline int LCA(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=19;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=19;i>=0;i--)
	if(f[x][i]!=f[y][i]){
		x=f[x][i];
		y=f[y][i];
	}
	return f[x][0];
}
int n,m;
inline int dis(int x,int y){
	return dep[x]+dep[y]-2*dep[LCA(x,y)];
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<n;i++)add(read(),read());
	
	Deal(1,1);
	int x,y,z;
	while(m--){
		x=read(),y=read(),z=read();
		int ans=1e9,w,mzx;
		int a1=LCA(x,y),a2=LCA(x,z),a3=LCA(z,y);
		
		mzx=dep[x]+dep[y]-2*dep[a1]+dis(z,a1);
		if(ans>mzx)ans=mzx,w=a1;
		mzx=dep[x]+dep[z]-2*dep[a2]+dis(y,a2);
		if(ans>mzx)ans=mzx,w=a2;
		mzx=dep[z]+dep[y]-2*dep[a3]+dis(x,a3);
		if(ans>mzx)ans=mzx,w=a3;

		printf("%d %d\n",w,ans);
	}
}

Supongo que te gusta

Origin www.cnblogs.com/naruto-mzx/p/12665861.html
Recomendado
Clasificación