Plantilla de clasificación de teoría de grafos-topológica

Orden topológico

La clasificación topológica es paraGráfico Acíclico Dirigido(Red AOV).
El método principal es:
cada vez encuentre un nodo con un grado de entrada de 0, y luego elija uno de ellos, y luego elimine los bordes conectados a él, es decir, reduzca el grado de entrada de los vértices adyacentes en 1, y repita esta operación hasta que se cuenten n nodos.
Cuando hay un bucle, los bucles están enclavados, cuando se alcanza un cierto paso, no hay ningún nodo con un grado de 0 y no hay una secuencia topológica.
Por lo tanto, al detectar si un gráfico tiene una secuencia topológica, se puede juzgar si tiene un anillo.

Flujo del algoritmo:

Use una cola para ejecutar e inicialice todos los vértices con un grado de 0 en la cola.

Se ejecuta principalmente en el siguiente ciclo de dos pasos hasta que no hay vértices con grado 0:

  1. Seleccione un vértice con un grado de entrada de 0 y déle salida;
  2. Elimina todas las aristas conectadas desde este vértice en el gráfico.

El bucle termina

Si el número de vértices de salida es menor que el número de vértices en el gráfico, significa que el gráfico tiene un bucle, es decir, no se puede ordenar topológicamente; de ​​lo
contrario, el resultado es una secuencia topológica (no única)

La complejidad del tiempo es O (n + m), donde n es el número de puntos y m es el número de lados.

Descripción del Título

Dado un gráfico dirigido con n puntos y m bordes, los puntos se numeran del 1 al n, y puede haber múltiples bordes y auto-bucles en el gráfico .
Genere cualquier secuencia topológica del gráfico dirigido. Si la secuencia topológica no existe, genere -1.

Si una secuencia A compuesta de todos los puntos en el gráfico satisface: Para cada borde (x, y) en el gráfico, x aparece antes de y en A, entonces A es una secuencia topológica del gráfico.

Formato de entrada La
primera línea contiene dos números enteros n y m

En las siguientes m líneas, cada línea contiene dos números enteros xey, lo que indica que hay un borde dirigido (x, y) desde el punto x al punto y.

El formato de salida es
una línea. Si hay una secuencia topológica, envíe cualquier secuencia topológica legal.

De lo contrario, salida -1.

Rango de datos
1≤n, m≤10 5
Ejemplo de entrada:

3 3
1 2
2 3
1 3

Salida de muestra:

1 2 3

Código

#include <iostream>
#include <cstring>

using namespace std;

const int N=1e5+10;
int h[N],e[N],ne[N],idx;
int q[N],hh,tt=-1;
int d[N];    统计每条边的入度
int n,m;     n个顶点 m条边    

void add(int a,int b)   存储a->b的边
{
    
    
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;    
}

bool topoSort()
{
    
    
    for (int i=1;i<=n;i++) {
    
    
        if (d[i]==0) q[++tt]=i;
    }
    while (hh<=tt) {
    
    
        int v=q[hh++];
        for (int i=h[v];i!=-1;i=ne[i]) {
    
    
            int j=e[i];
            d[j]--;
            if (!d[j]) q[++tt]=j;
        }
        if (tt==n-1) return true; 提前结束
    }    tt为-1,队列null;tt为n,队列有n+1个元素
    return tt==n-1;  
}

int main()
{
    
    
    memset(h,-1,sizeof h);  一定要注意初始化h数组,-1表示结束。
    scanf("%d%d",&n,&m);
    int a,b;
    while (m--) {
    
    
        scanf("%d%d",&a,&b);
        add(a,b); //a->b
        d[b]++;
    }
    if(topoSort()) {
    
    
        for (int i=0;i<n;i++) printf("%d ",q[i]);
    } else puts("-1");
    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/HangHug_L/article/details/113922186
Recomendado
Clasificación