拓撲排序 深度優先搜尋和廣度優先搜尋實現

2021-10-07 19:37:58 字數 1144 閱讀 9507

定義:給定n個頂點的有向圖g,如果乙個排列滿足任意乙個有向邊(v,u),v在該排列中都在u的前面,那麼這個排列稱為g的拓撲排序。

注意:無環圖的拓撲排序可能不止一種,有環圖不存在拓撲排序。

思路:深度優先搜尋(或廣度優先搜尋)整個圖,將出度為0的頂點入棧,中途要判斷是否會形成環,最後輸出棧得到的序列就是該圖的一種拓撲排序。

**1(深度優先搜尋)

vectorint>> edges;

//鄰接表

vector<

int> visited;

//0為未搜尋,1為已完成,2為搜尋中

vector<

int> result;

//陣列模擬棧

bool invalid =0;

//判斷是否有環

void

dfs(

int v)

else

if(visited[u]==2

)//說明遇到環,退出

} visited[v]=1

; result.

push_back

(v);

//已完成,入棧

}//拓撲排序

void

topol_sort()

}}

**2(廣度優先搜尋)

vectorint>> edges;

//鄰接表

vector<

int> indeg;

//儲存每個頂點的入度

vector<

int> result;

//儲存結果

bool

topol_sort()

while

(!q.

empty()

)}if(result.

size()

!= edges.

size()

)return0;

//說明有環,返回假

return1;

}

兩種方法的時間複雜度均為o(n+e),其中n為頂點數,e為弧數。

深度優先搜尋和廣度優先搜尋

深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...

廣度優先搜尋和深度優先搜尋

dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...

深度優先搜尋和廣度優先搜尋

定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...