SEMANA 8 B gato gato se precipita hacia adelante

Titulo

Como todos sabemos, TT es un amante de los gatos que tiene un gato mágico.
Un día, TT vio el juego del gato en la estación B. Hay N gatos en total, numerados 1, 2, 3, ..., N para jugar. Después del juego, el anfitrión Up clasificará a todos los gatos de adelante hacia atrás y distribuirá el pescado seco favorito. Desafortunadamente, en este momento, el equipo electrónico de TT fue golpeado por el rayo cósmico de des-inteligente, e incluso sin acceso a Internet, y, naturalmente, la ceremonia de entrega final no se pudo ver.
Afortunadamente, el gato mágico de TT registró los resultados de cada juego. Ahora quiere programar para determinar la secuencia del orden lexicográfico más pequeño. Por favor, ayúdenlo.

Entrada

Hay varios grupos de entradas, y la primera fila en cada grupo es dos números N (1 <= N <= 500), M; donde N representa el número de gatos y gatos, y M representa las siguientes M filas de datos de entrada. En las siguientes M filas de datos, cada fila también tiene dos enteros P1, P2 significa que el gato con el número P1 gana al gato con el número P2.

Salida

Dé una clasificación que cumpla con los requisitos. Hay un espacio entre los números del gato cuando sale, ¡no hay espacio después del último!

Otras notas: La clasificación que cumple con las condiciones puede no ser única. En este momento, se requiere que el equipo con el número más bajo salga primero; se garantiza que los datos de entrada sean correctos, es decir, los datos de entrada aseguran que pueda haber una clasificación que cumpla con los requisitos.

Entrada de muestra

4 3
1 2
2 3
4 3

Salida de muestra

1 2 4 3

Ideas

La relación ganar-perder de un gato se puede imaginar como una ventaja en un gráfico dirigido, a gana b, es decir, hay una ventaja que apunta de a a b, y la secuencia topológica de estos puntos es la clasificación final. Para generar la secuencia topológica con el orden lexicográfico más pequeño, se puede usar un montón mínimo para encontrar la secuencia topológica.

Código

#include <iostream>
#include <queue>
#include <algorithm>
#include <string.h>

using namespace std;

const int maxn = 505;
struct edge
{
	int to, next;
}e[maxn * 2];
int n, m, inde[maxn], head[maxn], tot;

void add(int x, int y)
{
	e[++tot].to = y;
	e[tot].next = head[x];
	head[x] = tot;
}

void toposort()
{
	priority_queue<int>q;
	while (!q.empty()) 
		q.pop();
	for (int i = 1; i <= n; i++)
		if (inde[i] == 0)
			q.push(-i);
	vector<int> ans;
	while (!q.empty()) 
	{
		int u = -q.top();
		q.pop();
		ans.push_back(u);
		for (int i = head[u]; i!=0; i = e[i].next)
			if (--inde[e[i].to] == 0)
				q.push(-e[i].to);
	}
	for (int i = 0; i < ans.size() - 1; i++)
		cout << ans[i] << " ";
	cout << ans[ans.size() - 1] << endl;
}

int main()
{
	while (scanf_s("%d%d",&n,&m)!=EOF) 
	{
		memset(head, 0, sizeof(head));
		memset(inde, 0, sizeof(inde));
		tot = 0;
		for (int i = 1; i <= m; i++) 
		{
			int a, b;
			scanf_s("%d%d", &a, &b);
			add(a, b);
			inde[b]++;
		}
		toposort();
	}
	return 0;
}
32 artículos originales publicados · elogiados 0 · visitas 669

Supongo que te gusta

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