演算法導論 22 4 5 用佇列實現拓撲排序

2021-06-18 21:15:25 字數 1063 閱讀 2332

題目:

在乙個有向無迴路圖g=(v,e)上,執行拓撲排序的另一種方法是重複地尋找乙個入度為0的頂點,將該點輸出,並將該頂點及其所有的出邊從圖中刪除。解釋如何來實現這一想法,才能使得它的執行時間為o(v+e)。如果g中包含迴路的話,這個演算法在執行時會發生什麼?

思考:

初始時,所有入度為0的頂點入佇列

while佇列不為空,作以下處理:

取佇列頭結點,並出佇列

處理以頭結點為起點的所有的邊,將邊的終點的入度-1

若入度減為0,則入佇列

**:

[cpp]view plain

copy

#include 

#include 

using

namespace std;  

#define n 10

//邊結點結構

struct edge  

};  

//頂點結點結構

struct vertex  

};  

//圖結構

struct graph  

~graph()  

};  

queue q;  

int time = 0;  

//插入邊

void insertedge(graph *g, edge *e)  

if(e1 && e1->end == e->end)  

return;  

if(e1 == e2)  

else

//插入邊的同時,計下每個頂點的入度

g->v[e->end]->degree++;  

}  }  

//拓撲排序

void topological(graph *g)  

//佇列不為空

while(!q.empty())  

}  cout<}  

int main()  

//拓撲排序並輸出

topological(g);  

return 0;  

演算法導論例程 佇列

佇列是一種delete的方式同棧不同的資料結構,遵循先進先出原則,因此對於佇列我們需要它的head和tail兩個屬性來描述入隊和出隊。佇列的結構如下 define length 1000 typedef struct queue 這裡把佇列的長度巨集定義了具體的數值,在實際應用時可以使用sizeof...

演算法導論 優先佇列

堆的應用 優先佇列。什麼是優先佇列?優先佇列是一種從來維護一組由元素構成的集合s的資料結構,其中每乙個元素都乙個值,被稱為關鍵字。優先佇列可以用堆來實現。優先佇列可以分為最大優先佇列 最小優先佇列。最大優先佇列支援的操作有 1.insert 2.maximum 3.extract max 4.inc...

拓撲排序(dfs用棧,bfs用佇列)

現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...