【2017.9.16周總結】
Tarjan與縮點
這周做了不少需要先縮點的題。本來10分鐘打出來的Tarjan模板,結果縮點各種錯。以下都是血與淚的教訓
- 關於Tarjan中的易錯點:
- 遇到未訪問的點則用對方的low更新自己的low
- 遇到訪問過且仍在棧中的點才用對方的dfn更新low
這兩種情況並不互為補集,不能寫成一個if-else
。
重新連邊要考慮是否允許重邊
若要過濾重邊,最好用set
來存邊,用rang-based loop
遍歷
(自環一般都要過濾:if (group[u] != group[v]) addedge(u,v);
)做任何拓補序問題之前,先檢視題目是否保證DAG,否則需用Tarjan縮點。
點分治
最基礎的靜態點分治框架大概長這個樣子:
bool vis[] = {};
int size[], max[], son[]; //son[x]表示x的重兒子
int dfssize(int x, int fa) {
//dfs處理以上3個陣列
//遇到已vis就不再前進了。即 if (!vis[v] && v != fa)
}
dfs(int x, int fa, ...);
cal(int x, ...);
void divide(int x) {
int Size = dfssize(x,0); //x只是一個入口。這個函式為找root做鋪墊
int root = x;
while (max[root]] > Size/2) //找root
root = son[root];
dfs(root,...); //解決關於整塊的問題。通常先由dfs把資訊(如dis)記錄到一個陣列或資料結構中,
cal(root,...); //再由cal()進行一些排序、統計等操作。
vis[root] = true;
for_each e(root, v) {
dfs(v,...); //需要扣除當路徑兩端出自同一子樹的情況
cal(v,...); //dfs時懾於vis[root]的阻攔,自然不會越出子樹
}
}
相關文章
- 周總結
- 周總結23
- 周總結7.19
- 8.3日周總結
- 第九周總結
- 第四周總結
- 2018第12周總結
- 暑假第四周總結
- 暑期第四周總結
- 2017W27 | 7.3-7.9 周總結
- 2024暑假第四周總結
- 第四周總結(2024.7.27)
- 資料結構3-4周總結(1) 基本操作資料結構
- 瓶子君前端進階演算法營首周總結前端演算法
- 2024.7.22至2024.7.27周總結
- 2024.8.11至2024.8.17周總結
- 2018Week11 | 3.12--3.18 周總結
- 樹結構總結
- ISP 連結總結
- 【連結 1】與靜態連結庫連結
- 資料結構-單連結串列、雙連結串列資料結構
- javaSE總結(轉+總結)Java
- 線性結構總結
- Node mongoose 結尾總結Go
- 《微機結構》總結
- 微機結構總結
- 結對作業總結
- 前端資料結構--線性結構-連結串列前端資料結構
- 連結串列基礎總結
- 集合資料結構總結資料結構
- javascript 詞法結構小結JavaScript
- MyBatis 結果對映總結MyBatis
- 資料結構-連結串列資料結構
- 結對程式設計總結程式設計
- ORACLE體系結構小結Oracle
- oracle體系結構總結Oracle
- 結對子作業總結
- 資料結構 - 連結串列資料結構