HDU Hangzhou eléctrica 1285 (fjutacm 1515) para determinar el rango en el juego de clasificación topológica

Descripción del problema
Hay equipos N Match (1 <= N <= 500 ), seguido de los números 2, 3,. . . . , N el juego, después del partido, el comité de árbitros quieren todos los equipos clasificados en orden de adelante hacia atrás, pero los árbitros no se puede acceder directamente a resultados de la carrera de cada equipo, sólo conocen los resultados de todos los partidos, que ganan P1 P2, con P1, P2, dijo al alinear P1 P2 antes. Ahora estamos programados para determinar la clasificación.
De entrada
se introduce una pluralidad de grupos, cada grupo de dos primer número de línea N (1 <= N <= 500), M; donde N representa el número de filas, entonces M indica los datos de entrada de M filas. La siguiente técnica de la línea M, cada línea tiene dos enteros P1, P2 representa es decir, el equipo P1 P2 ganó el equipo.
De salida
se le da una clasificación de acuerdo con los requisitos. Hay espacios entre la salida del equipo No., no hay espacio después de la última.

Otras notas: Clasificación elegible puede no ser único, que requiere que cuando un pequeño número de salida ocupa el primer lugar; los datos de entrada se garantiza que sea correcta, es decir, los datos de entrada deben ser capaces de garantizar que no es una clasificación satisfactoria.
SampleInput
. 4. 3
. 1 2
2. 3
. 4. 3
SampleOutput
. 1 2. 4. 3

clasificación topológica de principio que no entiendo muy bien, puede especificar directamente momento bing, esto es sólo una notas de estudio.
principio Algoritmo: desde el conjunto ordenado a ser sacado del punto cero (sin relación de energía de punto cero de los puntos grandes). Eliminación de todas las partes relevantes a este punto, el punto de salida de esta red de relaciones. operación anterior se repite hasta que sólo un punto hasta ahora.
De todos modos, vamos a redes punto de salida en orden descendente, para continuar a romper las redes. Por lo que los algoritmos de clave y cómo encontrar rápidamente el punto de cero.
e n puntos y bordes, la complejidad del algoritmo es O (e + n).
Tomar el título, por ejemplo, el punto grado cero que no está siendo ganó en el equipo desde entonces para asegurar que cada punto en la figura, un punto cero grados hacia fuera hasta cierto punto no es cero.
No sólo ganó una Clasificación de equipos perdidos deben estar delante. También se requiere el sujeto en muchos casos de pequeño número de filas en primer lugar, a continuación, para tomar existen colas de prioridad similares, pueden usarse para hacer cola de prioridad en orden ascendente operador bool frien definido <() para cambiar el <también puede pulse I el código, un significado.

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#include <string.h>
using namespace std;
const int MAX=1e3+5;

int in[MAX];
vector<int> out[MAX];
void TopoSort(int N)
{
  int i, j, x, y, ans;
  priority_queue<int> q;    // 编号小的要先在前面,但优先队列自动降序排列
  for (i=1; i<=N; i++)
    if (!in[i])             // 入度为0的,说明没被赢过,先压进优先队列
      q.push(-i);           // 加个负号,保证i小的在前面
  for (i=1; i<N; i++)
  {
    x = -q.top();           // 把头取出来,还原成正数
    q.pop();
    printf("%d ", x);       // 并输出
    for (j=0; j<out[x].size(); j++)   // 找所有x的边,开始删
    {
      y = out[x][j];        // 遍历x所有下家
      in[y] --;             // 删掉和x之间这条边,即和x这个上家断绝关系
      if (in[y]==0)         // 这时如果y的入度也变成0了,
        q.push(-y);         //那就加入q中
    }
  }   // 这个循环一定会遍历到q只剩一个元素,只要所有点都在图中
  printf("%d\n", -q.top());
}
int main()
{
  int N, M, P1, P2, i, j;
  while(~scanf("%d%d", &N, &M))
  {
    memset(in, 0, sizeof(in));
    for (i=1; i<=N; i++)
      out[i].clear();
    while (M--)
    {
      scanf("%d%d", &P1, &P2);
      in[P2] ++;
      out[P1].push_back(P2);
    }
    TopoSort(N);
  }
  return 0;
}

Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 513

Supongo que te gusta

Origin blog.csdn.net/qq_43317133/article/details/98184298
Recomendado
Clasificación