El gato mágico de la semana7 A TT

Descripción del título

Como todos sabemos, TT tiene un gato mágico.

En este día, TT se dedicó a jugar al juego "Cat and Mouse", pero antes de que el juego comenzara, el gato mágico inteligente contó el resultado final del juego TT. TT está muy sorprendido. No solo su gatito está realmente hablando, sino también ¿por qué esta linda niña es tan mágica?

Magic Cat le dice a TT que en realidad tiene una tabla de ganar-perder juego con N individuos y relaciones de ganar-perder M. Cada relación de ganar-perder es AB, lo que indica que A puede ganar B, y la relación de ganar-perder es transitiva. Es decir, A vence a B y B vence a C, por lo que A puede vencer a C.

TT no cree que su gatito pueda predecir ningún juego, por lo que quiere saber cuántos resultados de los jugadores no se pueden conocer de antemano. ¿Puedes ayudarlo?

Entrada

La primera línea da el número de grupos de datos.

La primera línea de cada conjunto de datos da N y M (N, M <= 500).

En las siguientes líneas M, cada línea recibe AB, lo que indica que A puede vencer a B.

Salida

Para cada conjunto de datos, es imposible saber de antemano cuántos juegos se ganan o se pierden. Tenga en cuenta que (a, b) es equivalente a (b, a), es decir, cada binario se calcula solo una vez.

Entrada de muestra

3
3 3
1 2
1 3
2 3
3 2
1 2
2 3
4 2
1 2
3 4

Salida de muestra

0
0
4

Ideas

Imagine al jugador como un punto en la figura, y convierta una victoria sobre b en un borde dirigido con una longitud de 1 entre los dos puntos de ab, y puede usar el algoritmo de Floyd para resolverlo. Es principalmente para cambiar la actualización del borde dirigido entre dos puntos a dis [i] [j] = max (dis [i] [j], dis [i] [k] y dis [k] [j]), entonces Cuando finaliza el algoritmo, todos los puntos se consideran como los puntos intermedios para pasar la relación ganar-perder, es decir, se obtienen todas las relaciones ganar-perder. Si dis [i] [j] y dis [j] [i] son ​​ambos cero, significa El resultado no está claro, de lo contrario, la relación es clara.

Código

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 505;
int n, m, a1, b1, ans, temp;
int dis[N][N];

void Floyd()
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			if (dis[i][k] != 0)
			{
				for (int j = 1; j <= n; j++)
					dis[i][j] = max(dis[i][j], dis[i][k] & dis[k][j]);
			}
}

int main()
{
	scanf_s("%d", &temp);
	for (int i = 0; i < temp; i++)
	{
		memset(dis, 0, sizeof(dis));
		scanf_s("%d%d", &n, &m);
		ans = 0;
		for (int j = 0; j < m; j++)
		{
			scanf_s("%d%d", &a1, &b1);
			dis[a1][b1] = 1;
		}
		Floyd();
		for (int k = 1; k <= n; k++)
			for (int l = 1; l <= n; l++)
				if (dis[k][l] == 0 && dis[l][k] == 0&&k!=l)
					ans++;
		ans /= 2;
		printf("%d\n", ans);
	}
    return 0; 
}
32 artículos originales publicados · elogiados 0 · visitas 675

Supongo que te gusta

Origin blog.csdn.net/qq_43814559/article/details/105545036
Recomendado
Clasificación