【圖】拓撲排序


參考 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM