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