關鍵路徑
含義表示乙個遞進過程
每個點之間都有聯絡
而這些聯絡可以組成乙個依次遞進的過程
比如:有結點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協議 傳輸控制協議,特點是 面向有連線,資料傳輸之前必須先建立連線,底層是 三次握手 優點是...