題目:
在乙個有向無迴路圖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 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...