Códigos de clasificación topológica

URL de referencia https://blog.csdn.net/ywcpig/article/details/52599867

Clasificación topológica

Idea central

(1) Seleccione un vértice sin un precursor (es decir, el grado de entrada es 0) del gráfico dirigido, y lo emite;

(2) Eliminar este vértice y todos los arcos que terminan en él desde el gráfico dirigido;

Repita los dos pasos anteriores hasta que el gráfico esté vacío, o el gráfico no esté vacío pero no se encuentren vértices sin precursores.

// fecha: 2020.4.21
 // autor: https://blog.csdn.net/ywcpig/article/details/52599867 
#include <bits / stdc ++. h> #define MAX_VERTEX_NUM 26
 usando el espacio de nombres std;
// 图 用 邻接 表 存储 
typedef struct ArcNode 
{ int adjvex;
    struct ArcNode * nextarc; 
    ArcNode () 
    { 
        nextarc = NULL; 
    } 
} ArcNode; 
typedef struct VNode 
{ int data; 
    ArcNode * firstarc; 
    VNode ()
 
    

    
    {
        firstarc = NULL; 
    } 
} VNode, AdjList [MAX_VERTEX_NUM]; 

typedef struct 
{ 
    AdjList vertices; 
    int vexnum, arcnum; 
} ALGraph; //
 
bool TopologicalSort (ALGraph G, int * indegree) 
{ 
    stack < int > s;
     int i, k ;
     for (i = 1 ; i <G.vexnum + 1 ; i ++ ) 
    { 
        if (! indegree [i]) 
            s.push (i); 
    } // Coloque cada nodo con un grado de 0 en la pila

    int count = 0 ; 
    ArcNode * p;
     while (! s.empty ()) 
    { 
        i = s.top (); s.pop 
        (); // Acceda al nodo 
        cout << G.vertices [i] .data << " -> " ; 
        count ++ ;
         for (p = G.vertices [i] .firstarc; p; p = p-> nextarc) // Acceda a la lista de adyacencia de este nodo 
        { 
            k = p-> adjvex ; 
            indegree [k] -; // Grado de entrada del punto de acceso menos 1 
            if (! indegree [k]) //如果 入 度 为 0 , 入栈
                s.push (k); 
        } 
    } 
    if (cuenta < G.vexnum)
         devuelve  falso ;
    volver  verdadero ; 
} 

int main () 
{ 
    int i; 
    ALGraph g; 
    cout << " 载入 图 中 ... " << endl; 
    ifstream fin ( " in.txt " ); 
    aleta >> g.vexnum >> g.arcnum;
    para (i = 1 ; i <g.vexnum + 1 ; i ++ ) 
        g.vertices [i] .data = i;

    int b, e; 
    ArcNode * p;
     int * indegree = new  int [g.vexnum + 1 ];
     // Tenga en cuenta int * a = new int (n); solicite un espacio variable entero, asigne un valor inicial de n y defina Un puntero entero apunta al espacio de direcciones
     // int * indegree = (int *) malloc (sizeof (int) * (g.vexnum + 1)); 
    memset (indegree, 0 , sizeof ( int ) * (g.vexnum + 1 ));
     para (i = 1 ; i <g.arcnum + 1 ; i ++ ) 
    { 
        fin >> b >> e; 
        cout << " << i << " 条 边 :" << b << " -> " << e << endl; 

        p = nuevo ArcNode (); 
        p -> adjvex = e; 
        p -> nextarc = g.vertices [b] .firstarc; 
        g.vertices [b] .firstarc = p; 
        grado [e] ++ ; 
    } 

    if (TopologicalSort (g, indegree)) 
        cout << " 正常 完成!" << endl;
    más 
        cout << " ¡El gráfico dirigido tiene un bucle! " <<endl 

    devuelve  0 ; 
}

 

Se pueden crear dos conjuntos de datos de prueba en el archivo de texto in.txt 
1) con anillo 

4 4 
1 2 
2 3 
3 4 
4 2 

2) sin anillo 

12 16 
1 2 
1 3 
2 3 
1 4 
3 5 
4 5 
11 6 
5 7 
3 7 
3 8 
6 8 
9 10 
9 11 
9 12 
10 12 
1 12

  

El almacenamiento del diagrama debe revisarse nuevamente de manera competente

 

Supongo que te gusta

Origin www.cnblogs.com/someonezero/p/12750015.html
Recomendado
Clasificación