有向網的拓撲排序 分清發生與開始的內涵

2021-10-12 07:12:39 字數 3249 閱讀 4395

理論:

**塊:

#include

#include

#include

#include

//圖的鄰接表型別定義

typedef

char vertextype[4]

;typedef

int infoptr;

typedef

int vrtype;

#define statcksize 100

#define false 0

#define true 1

#define maxsize 50

//最大頂點個數

typedef

enum

graphkind;

//圖的型別:有向圖、有向網、無向圖和無向網

//建立全域性變數,儲存邊的最早開始時間

vrtype ve[maxsize]

;//建立全域性變數,儲存邊的最晚開始時間

vrtype vl[maxsize]

;typedef

struct arcnode arcnode;

typedef

struct vnodevnode,adjlist[maxsize]

;typedef

struct

adjgraph;

typedef

int datatype;

//定義順序棧

typedef

struct

seqstack;

//函式宣告

intlocatevertex

(adjgraph g,vertextype v)

;void

creategraph

(adjgraph *g)

;void

displaygraph

(adjgraph g)

;void

destroygraph

(adjgraph *g)

;//順序棧初始化

void

initstack

(seqstack *s)

;//判斷棧是否為空

intstackempty

(seqstack s)

;//進棧操作

intpushstack

(seqstack *s,datatype e)

;//出棧操作

intpopstack

(seqstack *s,datatype *e)

;//

void

creategraph

(adjgraph *g)

printf

("請輸入 弧尾 弧頭 權值(以空格作為間隔);\n");

for(k=

0;k>arcnum;k++)(

*g).kind=dn;

}//查詢

intlocatevertex

(adjgraph g,vertextype v)

}return-1

;}//銷毀有向網

void

destroygraph

(adjgraph *g)}(

*g).vexnum=0;

//將頂點的數目為0

(*g)

.arcnum=0;

//將邊的數目為0

}void

displaygraph

(adjgraph g)

printf

("\n%d條邊:\n",2

*g.arcnum)

;for

(i=0

;i)printf

("\n");

}}//順序棧初始化

void

initstack

(seqstack *s)

//判斷棧是否為空

intstackempty

(seqstack s)

else

}//進棧操作

intpushstack

(seqstack *s,datatype e)

else

}//出棧操作

intpopstack

(seqstack *s,datatype *e)

else

}//統計各頂點的入度

void

findindegree

(adjgraph g,

int indegree)

}}//有向網g的拓撲排序。如果圖g沒有迴路,則輸出g的乙個拓撲序列並返回1,否則返回0

inttopologicalsort

(adjgraph g,seqstack *t)

initstack

(t);

//初始化拓撲排序列頂點棧

for(i=

0;i)while(!

stackempty

(s))}if

(count

else

}//輸出 n的關鍵路徑

intcriticatlpath

(adjgraph n)

}for

(i=0

;i)while(!

stackempty

(t))}}

printf

("\n事件的最早發生時間和最晚發生的時間\n i ve[i] vl[i]\n");

for(i=

0;i)printf

("關鍵路徑為:");

for(i=

0;iprintf

("\n");

count=0;

for(j=

0;j}printf

("關鍵活動為:");

//輸出關鍵路徑

for(k=

0;k)printf

("\n");

return1;

}int

main()

效果圖:

拓撲排序,AVO網的判斷

時 限 2000 ms 記憶體限制 5000 k 總時限 3000 ms 描述 以鄰接矩陣給出一張以整數為結點的有向圖,其中0表示不是相鄰結點,1表示兩個結點相連且由當前結點為初始點。利用拓撲排序判斷圖中是否有環,若有輸出yes沒有輸出no 輸入 結點數 鄰接矩陣 輸出 yes no 輸入樣例 3 ...

設計AOV網拓撲排序的演算法

對乙個有向圖構造拓撲序列的過程稱為拓撲排序 不唯一 1 圖的儲存結構 採用鄰接表儲存,在頂點增加乙個入度域 2 棧s儲存所有無前驅的頂點 1.棧s初始化 累加器count初始化 2.掃瞄頂點表,將沒有前驅 入度為0 的頂點壓棧 3.當棧s非空時迴圈 3.1 j 棧頂元素出棧 輸出頂點j count ...

拓撲排序的原理與實現

拓撲排序顧名思義是一種排序演算法,它用於給有向圖排序。有向圖是由一組頂點和一組有方向的邊組成的圖,每條有方向的邊都連線著有序的一對頂點,因此a b代表a可以到達b,並不代表b就能到達a。拓撲排序的結果就是乙個有向圖的頂點序列 或稱為拓撲序列 想要學習 c 程式設計 就需要先學習 計算機導論 想要學習...