【图】拓扑排序

参考 CSDN拓扑排序的原理及Java实现

  拓扑排序C++实现

  拓扑排序百度百科

若不是上了学堂在线的数据结构课程,我估计今后不做技术的话,都接触不到图的拓扑排序这个概念了。先是看了百度百科的解释,拓扑排序现实中的应用是选课,即某些课程需要一些先修课程的学习后才适合上。比如数据结构的学习,是离散数学、编程语言,后者是前者的先修课程。

拓扑排序定义:将有向无环图DAG中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面

1.创建图;

2.将图中入度为0的顶点压入栈中;

3.将栈顶元素出栈,并将其邻接顶点的入度减1,若该邻接顶点的入度等于0,将该邻接顶点入栈;否则将边更新为栈顶元素的另一条边。

4.重复3,直至栈空。

一道关于OJ上的旅行商的问题,对图中可能通过的点的最大个数进行统计。实质是拓扑排序,但并不完全是排序,这里需要对一条通路上的顶点个数进行统计。

如图所示,1~6个村庄,但不是任意两个村庄之间都能相通,统计最长道路经过的村庄数,此时该结果为4.

以下是deadline截止前写的,但OJ提交后没有结果,只有一个compilation error编译错误的指示。codeblocks上测试了几个是通过的,或许还有错误吧,不过稍微能理解图的创建和拓扑排序了。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <iostream>
  4 #define MAX_VEX 1000001 //顶点
  5 
  6 #define _Size 100000 //栈的大小
  7 
  8 struct Stack{
  9     int *element;
 10     int top;
 11     int _size;
 12 
 13     void initialStack(){
 14         element = new int[_Size];
 15         top = -1;
 16         _size = _Size;
 17     }
 18     void push(int x){
 19         element[++top] = x;
 20     }
 21     int pop(){
 22         return element[top--];
 23     }
 24 }S;
 25 
 26 
 27 typedef struct edgeNode {
 28     int adjvex;
 29    // int num;
 30     edgeNode *nextedge;
 31 }edgeNode;
 32 
 33 typedef struct vexNode{
 34     int data;
 35     edgeNode *firstedge;
 36     int inDegree = 0; //入度初始为0
 37 }vexNode;
 38 
 39 typedef struct vexList{
 40     vexNode vexlist[MAX_VEX];
 41     int vexnum, edgenum;
 42 }vexList;
 43 
 44 void GraphList(vexList &G, int n, int m){
 45     G.edgenum = m;
 46     G.vexnum = n;
 47     for (int i = 1; i < n + 1; i++){
 48         G.vexlist[i].data = i; // 顶点从1~n;
 49         G.vexlist[i].firstedge = NULL;
 50 
 51     }
 52     for (int i = 0; i < m ; i++){  // 有向边
 53         int from, to;
 54         scanf("%d %d", &from, &to);
 55         edgeNode *p = new edgeNode;
 56         p->adjvex = to;
 57         p->nextedge = G.vexlist[from].firstedge;
 58         G.vexlist[from].firstedge = p;
 59     }
 60 }
 61 
 62 int Tsort(vexList &G){
 63    // Stack;
 64     S.initialStack();
 65     edgeNode *p;
 66     int cnt = 1;
 67     for (int i = 1; i < G.vexnum + 1; i++){
 68         p = G.vexlist[i].firstedge;
 69         while (p){
 70             G.vexlist[p->adjvex].inDegree++;
 71             //G.vexlist[i].firstedge->num++;
 72             p = p->nextedge;
 73         }
 74     }
 75     for (int i = 1; i < G.vexnum + 1; i++){
 76         if(G.vexlist[i].inDegree == 0){
 77             S.push(i);
 78         }
 79     }
 80     while (S.top != -1){
 81         int j = S.pop();
 82         //cnt++;
 83         p = G.vexlist[j].firstedge;
 84         while (p){
 85             G.vexlist[p->adjvex].inDegree--;
 86           //  G.vexlist[j].firstedge->num--;
 87             if (G.vexlist[p->adjvex].inDegree == 0 && p->nextedge == NULL){
 88                 S.push(p->adjvex);
 89                 cnt++;
 90             }
 91 
 92             p = p->nextedge;
 93         }
 94     }
 95     return cnt;
 96 }
 97 vexList G;
 98 int main(){
 99     int n, m;
100     int cnt = 0;
101     scanf("%d %d", &n, &m);
102     GraphList(G, n, m);
103     cnt = Tsort(G);
104     printf("%d", Tsort(G));
105     return 0;
106 }
原文地址:https://www.cnblogs.com/cnblogsnearby/p/4574786.html