P1551 Familiares (y verifique las preguntas de la plantilla)

Antecedentes del tema
Si un miembro de la familia es demasiado grande, en realidad no es fácil juzgar si dos personas son parientes. Ahora proporcione un diagrama de una relación relativa y pregunte si las dos personas dadas son parientes.

Descripción del título
Regulación: xey son parientes, y y z son parientes, entonces xyz también son parientes. Si xey son parientes, entonces los parientes de x son parientes de y, y los parientes de y también son parientes de x.

Formato de entrada La
primera línea: tres números enteros n, m, p, (n <= 5000, m <= 5000, p <= 5000), que indican respectivamente que hay n individuos ym parientes Pregunte p por parientes.

Las siguientes m líneas: cada línea tiene dos números Mi, Mj, 1 <= Mi, Mj <= N, lo que indica que Mi y Mj están relacionados.

Siguiente línea p: cada línea tiene dos números Pi, Pj, preguntando si Pi y Pj están relacionados.

El formato de salida es
P líneas, con un 'Sí' o 'No' por línea. Indica que la respuesta a la i-ésima pregunta es "tiene" o "no tiene" parientes.

Muestra de entrada y salida
Entrada n. ° 1
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
Salida n. ° 1


No
Análisis de preguntas: Esta es una pregunta modelo de búsqueda de unión desnuda. Establezca el antepasado de cada persona como él mismo, y luego buscar a sus antepasados ​​de acuerdo con cada par de parientes. Si los antepasados ​​son diferentes, establezca el antepasado de una persona a la otra. Finalmente, los antepasados ​​de los parientes serán el mismo "antepasado", al juzgar si los antepasados ​​son iguales o no, puede saber si están relacionados.

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n, m, p, f[5010], x, y;

int query(int x){
    
    
	if(f[x] == x) return x;
	else return query(f[x]);
}

void merge(int x, int y){
    
    
	int f1 = query(x);
	int f2 = query(y);
	if(f1 != f2) f[f1] = f2;
} 

int main(){
    
    
	scanf("%d%d%d", &n, &m, &p);
	for(int i = 1; i <= n; i++){
    
    
		f[i] = i;
	}
	for(int i = 1; i <= m; i++){
    
    
		scanf("%d%d", &x, &y);
		merge(x ,y);
	}
	for(int i = 1; i <= p; i++){
    
    
		scanf("%d%d", &x, &y);
		if(query(x) == query(y)) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_42920035/article/details/109248317
Recomendado
Clasificación