Asientos de fila PTA L2-010 (búsqueda combinada)

L2-010 fila de asientos (25 puntos)

Lo más sutil de preparar un banquete es organizar los asientos para todos los invitados que asisten al banquete. En cualquier caso, ¡es imposible alinear a dos rivales en la misma mesa de banquete! Esta ardua tarea ahora se le confía a usted. Para cualquier par de invitados, por favor escriba un programa para decirle al anfitrión si pueden organizarse para sentarse juntos.

Formato de entrada:
Ingrese la primera línea para dar 3 enteros positivos: N (≤100), es decir, el número total de invitados que asistieron al banquete, luego estas personas se numeran del 1 al N; M es la relación conocida entre los dos invitados Número; K es el número de consultas. Luego M líneas, cada línea da la relación entre un par de invitados, el formato es: relación invitado 1 invitado 2, donde relación 1 significa amigo, -1 significa oponente muerto. Tenga en cuenta que dos personas no pueden ser a la vez amigos y enemigos. En las últimas K líneas, cada línea da un par de números de invitados para ser consultados.

Aquí se asume que los amigos de los amigos también son amigos. Pero el enemigo del enemigo no es necesariamente un amigo, y el enemigo de un amigo no es necesariamente un enemigo. Solo una relación hostil puramente directa es absolutamente imposible de sentar juntos.

Formato de
salida : envíe una línea de resultado para cada consulta: si los dos invitados son amigos y no hay una relación hostil, entonces la salida No hay problema; si no son amigos pero no hostiles, entonces la salida es OK; si no son hostiles Si hay hostilidad entre ellos, pero también hay amigos en común, entonces salida OK pero ...; si solo tienen una relación hostil, salida De ninguna manera.

Ejemplo de entrada:
7 8 4
5 6 1
2 7-1
1 3 1
3 4 1
6 7-1
1 2 1
1 4 1
2 3 -1
3 4
5 7
2 3
7 2
Ejemplo de salida:
No hay problema
OK
OK pero ... de
ninguna manera

análisis:

Lo más problemático en esta pregunta es la frase "un amigo de un amigo también es un amigo". No está claramente expresada en la pregunta. De hecho, es:
①Si el amigo de un amigo es un enemigo, no es un amigo
②Un amigo de un amigo de un amigo es un amigo de un amigo ... (siempre que no lo sea Los enemigos) son todos amigos,
por lo que solo cuando se cumplen estas dos reglas podemos usar la búsqueda combinada. Si no está claro al principio, se hará como una simulación ordinaria, por lo que muchas veces está mal.

Código:


#include <stdio.h>

using namespace std;

int father[107]; int Find(int a) {
    
    
	if (a != father[a])
		return father[a] = Find(father[a]);
	return a;
}

int main() {
    
    
	for (int i = 0; i<107; i++)
	{
    
    
		father[i] = i;
	}
	int n, m, k;
	bool en[107][107] = {
    
     0 };
	scanf("%d%d%d", &n, &m, &k);
	while (m--)
	{
    
    
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		if (c == 1)
		{
    
    
			int fa = Find(a);
			int fb = Find(b);
			if (fa != fb) father[fa] = fb;
		}
		else en[a][b] = en[b][a] = 1;
	}

	while (k--)
	{
    
    
		int a, b;
		scanf("%d%d", &a, &b);
		int fa = Find(a);
		int fb = Find(b);
		if (en[a][b])
		{
    
    
			if (fa == fb)puts("OK but...");
			else puts("No way");
		}
		else
		{
    
    
			if (fa == fb)puts("No problem");
			else puts("OK");
		}
	}
	return 0;
}


Supongo que te gusta

Origin blog.csdn.net/qq_43700916/article/details/88364245
Recomendado
Clasificación