拓撲排序的英文名是 topological sorting。拓撲排序是在拓撲排序要解決的問題是給乙個圖的所有節點排序。
拓撲排序的目標是將所有節點排序,使得排在前面的節點不能依賴於排在後面的節點。 ——oi-wiki
dag(有向無環圖)
中每次選則入度為 0 的節點加入佇列,並刪除與這個節點相連的邊,重複執行此操作。
這樣做的作用是後面加入佇列的節點一定不依賴於前面的節點,因此拓撲排序有無後效性,可以用於dp
。
也可以用於判環,當隊列為空時若還有邊則該圖有環。
例題 1:
p1807 最長路
思路很簡單,d
用於儲存最長距離,rd
用於儲存入度。
第一遍**:
#include#include#includeusing namespace std;
const int n = 1505;
int n, m;
int u, v, w;
int t;
long long d[n];
bool f[n][n];
int g[n][n];
int rd[n];
queue q;
int main()
while(m--)
d[1] = 0;
q.push(1);
while(!q.empty())
}} }
if(d[n] == -0x7f7f7f7f7f7f7f7f)else
return 0;
}
45 分,下了一組資料,發現有重邊的情況。。。。
略改輸入部分**。
#include#include#includeusing namespace std;
const int n = 1505;
int n, m;
int u, v, w;
int t;
long long d[n];
bool f[n][n];
int g[n][n];
int rd[n];
queue q;
int main()
while(m--)
d[1] = 0;
q.push(1);
while(!q.empty())
}} }
if(d[n] == -0x7f7f7f7f7f7f7f7f)else
return 0;
}
然並卵,還是 wa。
原因是其他與目標路徑無關的點沒有入隊,導致部分點最長路已經確定了,但入度不為 0,解決方法就是在 1 入隊之前先把其他入度為 0 的點入隊,a 之。
最終**:
#include#include#includeusing namespace std;
const int n = 1505;
int n, m;
int u, v, w;
int t;
long long d[n];
bool f[n][n];
int g[n][n];
int rd[n];
queue q;
int main()
while(m--)
for(int i = 2; i <= n; i++) }
while(!q.empty())
}} }
d[1] = 0;
q.push(1);
while(!q.empty())
}} }
if(d[n] == -0x7f7f7f7f7f7f7f7f)else
return 0;
}
其實可以跑spaf
例題 2:
p1137 旅行計畫
類似板子題,一開始只需要將所有入度為 0 的點入隊,沒有奇怪資料。
**:
#include#include#include#includeusing namespace std;
const int n = 1e5 + 10;
int n, m, x, y, t;
int rd[n], d[n];
vector g[n];
queue q;
int main()
while(m--)
for(int i = 1; i <= n; i++) }
while(!q.empty())
} }for(int i = 1; i <= n; i++)
return 0;
}
總結:
要注意題目對於圖的描述,是否有重邊或自環;
注意資料範圍,最長的距離是等於 \((n-1) \cdot d_\);
我可真是蒟蒻,連拓撲排序都寫不清楚。
LDUOJ周練 儲存名畫 拓撲排序
description 在乙個byteland上有一副非常有名的圖畫需要被封存。這個作品需要在2個實驗室進行處理。這個處理過程被分為許多步驟。對於每個步驟,我們知道它必須要在哪個實驗室進行。在兩個實驗室之間運輸這些這些美麗但又易碎的畫會帶來額外的風險,因此這個運輸的過程需要盡可能的被避免。理想情況下...
python 拓撲排序 Python 拓撲排序
python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...
第十三周 專案五 拓撲排序
檔名稱 graph.cpp 完成日期 2016年12月8日 版本號 vc 6.0 問題描述 拓撲排序 輸入描述 無 程式輸出 graph.cpp include include include graph.h 功能 由乙個反映圖中頂點鄰接關係的二維陣列,構造出用鄰接矩陣儲存的圖 引數 arr 陣列名...