演算法導論 鄰接表儲存的拓撲排序

2021-06-19 16:50:39 字數 1981 閱讀 1552

在鄰接表儲存結構中,為了便於檢查每個頂點的入度,可在頂點表中增加乙個入度域(id),這樣的鄰接表如下圖所示,這樣只需對由n個元素構成的頂點表進行檢查就能找出入度為0的頂點。為了避免對每個入度為0的頂點重複訪問,可用乙個鏈棧來儲存所有入度為0的頂點。在進行拓撲排序前,只要對頂點表進行一次掃瞄,便可將所有入度為0的頂點都入棧,以後每次從棧頂取出入度為0的頂點,並將其輸出。 

原始圖為:

其對應的鄰接表為:

鄰接表儲存結構中實現拓撲排序演算法的步驟為:

(1) 掃瞄頂點表,將入度為0的頂點入棧。

(2) 當棧非空時執行以下操作:

1.將棧頂頂點vi的序號彈出,並輸出之;

2.檢查vi的出邊表,將每條出邊表鄰接點域所對應的頂點的入度域值減1,若該頂點入度為0,則將其入棧;

(3) 若輸出的頂點數小於n,則輸出「有迴路」,否則拓撲排序正常結束。

在具體實現時,鏈棧無須占用額外空間,只需利用頂點表中入度域值為0的入度域來存放鏈棧的指標(即指向下乙個存放鏈棧指標的單元的下標),並用乙個棧頂指標top指向該鏈棧的頂部即可。由此給出以下的具體演算法:

#include#include#define n 7//頂點個數

//鄰接表的結構體

typedef struct node

edgenode;

typedef struct

vexnode;

//進行拓撲排序

void toposort_adjtable(vexnode ga[n])

p=p->next;

} }if(madjvex=2;

ga[0].link=s;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=3;

ga[0].link->next=s;

s->next=null;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=6;

ga[1].link=s;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=7;

ga[1].link->next=s;

s->next=null;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=7;

ga[2].link=s;

s->next=null;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=3;

ga[3].link=s;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=5;

ga[3].link->next=s;

s->next=null;

s=(edgenode *)malloc(sizeof(edgenode));

s->adjvex=7;

ga[4].link=s;

s->next=null;

ga[5].link=null;

ga[6].link=null;

//初始化邊表結束

toposort_adjtable(ga);//進行拓撲排序

printf("\n");

}

解釋說明

原文:

使用鄰接表進行拓撲排序的演算法說明

講拓撲排序的概念,先來回顧乙個大家熟悉的東西 技能樹 圖 因為這個特好理解,玩過暗黑或其他rpg遊戲的都應該見過類似的技能樹,一句話,就是學習高階技能前需要先學習之前的低階技能。乙個技能樹其實是乙個簡單的圖,你可以把它再變化一下就是一張圖,即讓一些高階技能間也發生聯絡,使得學習一種高階技能可以通過多...

拓撲排序 C語言 鄰接表

資料結構 typedef struct side 邊 side,slink typedef struct vertex 頂點 vertex,adjlist 20 typedef struct graph 圖 graph,glink 建立 void creategraph glink g printf...

基於鄰接表的拓撲排序實現

由於 比較簡單,就直接貼出來了 1 include 2 include 3 include 4 include 5 using namespace std 67 8enum graphtype9 1516 結點顏色代表遍歷情況 17enum colortype18 2324 template25 c...