拓撲排序 看這個就完了

2021-10-06 07:40:02 字數 4469 閱讀 1193

關鍵路徑

含義表示乙個遞進過程

每個點之間都有聯絡

而這些聯絡可以組成乙個依次遞進的過程

比如:有結點a,b,c

c結點完成後才能做b結點,而b結點完成後才能進行a結點

即c->b->a 這樣乙個排序的序列

所以拓撲排序就是進行這樣的乙個過程

拓撲排序的過程

因為是要找乙個遞進過程

所以要先統計入度為零的點

然後把度為0的結點刪除 (其實不是真的刪除,下面**有)

如果發現這個度為0的臨鄰接點在刪除度為0的結點後度也是0

就繼續刪除

而這些每次刪除的結點組成的序列就是拓撲排序

有可能會不成功 不成功的原因是有迴路

所以函式裡最後判斷的是成功排序的數量是否等於總點數

幾個注意的點

拓撲排序的結果是很有可能不同的

因為用的儲存方式和排序方式的不同

導致結果的不同

像 : 用佇列或棧儲存度為0的點

用bfs的方式排序(找度為0的點) 或 用dfs的方式

下面我的**都將會涉及到的

這個是資料結構課程中講的完整版的拓撲排序的**

因為是第一次學習,所以**就很麻煩

用的是鄰接表存圖 + bfs + 佇列

#include

#include

#include

using

namespace std;

#define max 100

//最大頂點數

typedef

int vertex;

// 用頂點下標表示頂點

typedef

int weighttype;

// 權重

typedef

char datatype;

//儲存的資料型別

// 邊的定義

typedef

struct enode *ptrtoenode;

struct enode

;typedef ptrtoenode edge;

// 鄰接點的定義

typedef

struct adjvnode *ptrtoadjvnode;

struct adjvnode

;// 頂點表頭節點的定義

typedef

struct vnode

adjlist[max]

;// 圖結點的定義

typedef

struct gnode *ptrtognode;

struct gnode

;typedef ptrtognode lgraph;

// 以鄰接表的方式儲存的圖型別

lgraph creategraph

(int vertexnum)

void

insertedge

(lgraph graph, edge e)

lgraph buildgraph()

}// 如果頂點有資料 讀入資料

// for (v = 0; v < graph->nv; i++)

// return graph;

}/* 鄰接表儲存 - 拓撲排序演算法 */

bool

topsort

(lgraph graph, vertex toporder)

/* while結束*/

if(cnt != graph-

>nv)

return

false

;/* 說明圖中有迴路, 返回不成功標誌 */

else

return

true;}

intmain()

我覺得記住這個就夠了

// 拓撲

#include

#include

#include

using

namespace std;

const

int max =

100000

;// 鄰接點

vectorint>> outdegree;

// 每個點的入度

vector<

int> indegree;

int n;

vector<

int> topoder;

bool

topsort()

// 進入拓撲排序

int cnt =0;

// 結果

while

(!q.

empty()

)}for(

auto e : topoder)

cout << e <<

' ';

cout << endl;

// 有迴圈圖的話cnt是不等於n的

return cnt == n ?

true

:false;}

int visited[max]

;void

dfs(

int v)

} topoder.

push_back

(v);

}int

main()

cout << endl

<<

topsort()

;return0;

}

鄰接矩陣 + 棧

/ 鄰接矩陣法

// #include

// #include

// using namespace std;

// const int max = 1000;

// int out[max][max];

// int indegree[max];

// int n;

// bool topological()

// // }

// }

// stacks;

// for (int i = 1; i <= n; i++)

//

// int topoder[max];

// int cnt = 0;

// while (!s.empty())

//

// }

// }

// }

// }

// int main()

//

過程

假如先走1結點

dfs走到最深處

走到盡頭3結點 然後返回 在返回之前把3結點記錄到拓撲排序的陣列中

在從3返回到4 把4在記錄到陣列中

從4返回到1的鄰接點遍歷的過程中 去訪問2

就直接從2返回了 還有記錄哦

最後就回到1 然後記錄返回了

會發現 這樣的序列其實的反著的, 所以用棧儲存

還要注意一點

dfs在判斷是不是 迴路 的時候稍微有點動腦筋

設vis有三個值 -1 ,0, 1

-1 : 這個點已經訪問過 且 由別的結點為頭去訪問過的

0 : 沒有訪問

1 : 這個點(y)已經訪問過 且 (vis[x] = 1) x就是之前出發的點 即y是由x過去的點

而現在又回到了x 所以就是乙個迴路了 好處

dfs的**簡潔

但是思路較為複雜

不用專門記錄入度

#include

#include

#include

#include

using

namespace std;

const

int max =

100000

;// 鄰接點

vectorint>> outdegree;

int n;

vector<

int> visited;

// 結果

stack<

int> topoder;

bool

dfs(

int k)

// -1代表已訪問過, 但不是從當前系列dfs訪問來的

visited[k]=-

1;topoder.

push

(k);

return

true;}

bool

topsort()

}return

true;}

intmain()

cout << endl

<<

topsort()

<< endl;

return0;

}

傳送門

sql函式group concat 看這個就好了

描述 將該字段通過過逗號分隔展示 缺點 展示長度有限制,一般是1024 憑空截斷了後面的資料 查詢當前資料庫長度 show variables like group concat max len 果然是1024 1 設定當前session的group concat長度,其他session連線不受影響...

面試之MySQL看這個就夠了

關於二者的對比與總結 1.count運算上的區別 因為myisam有快取表meta data 行數等 因此在做count 時對於乙個結構很好的查詢是不需要消耗多少資源的。而對於innodb來說,則沒有這種快取。2.是否支援事務和崩潰後的安全恢復 myisam 強調的是效能,每次查詢具有原子性,其執行...

關於網路程式設計問題,看這個就夠啦!!!

網路 網際網路 區域網 通訊 資料傳輸 協議 規則規範 tcp協議 傳輸控制協議 transmission control protocol ip協議 網際網路協議 internet protocol tcp協議 傳輸控制協議,特點是 面向有連線,資料傳輸之前必須先建立連線,底層是 三次握手 優點是...