拓撲排序這種新手演算法,在一年前我就已經系統地學過,但由於各種各樣的原因,我不是很理解。在最近的比賽中,又遇到了一道拓撲排序題,儘管我運用堆勉強解決,但還是很不甘心,所以今天來複習一下拓撲排序。
先來說說拓撲排序是什麼。雖然名字叫排序,但拓撲排序卻不是我們平常說的排序。對於乙個有向無環圖g=(v,e)來說,其拓撲排序是其所有結點的一種線性次序,該次序滿足如下條件:如果圖g包含邊(u,v),則節點u在拓撲排序中處於節點v的前面(如果圖中包含環路,則不可能拍出乙個線性次序)。因此,我們可以將圖的拓撲排序看作是圖的所有節點在一條水平線上排開,所有有向邊都從左指向右。
明白了拓撲排序的定義,實現就很容易了。對於乙個有向無環圖g=(v,e),我們所需的時間複雜度就是o(v+e),v是點數,e是邊數。我們可以從任意乙個節點開始,dfs一次,然後,維護乙個佇列,當當前搜尋到的點沒有其他未經過的點相鄰時,我們就可以將它放入隊尾,最後輸出佇列就行了。
**如下:
#include#includeusing namespace std;
int n,m,u,v,tot,k;
int f[200001][3],q[100001],ans[100001];
bool bz[200001];
void dfs(int x) }
k++;
ans[k]=x;
}int main()
for (int i=1;i<=n;i++) }
for (int i=k;i>=1;i--)
printf("%d ",ans[i]);
printf("\n");
return 0;
}
Swapping Places 拓撲排序 詳解
給定s種動物,l對朋友關係,n個動物,如果兩個相鄰的動物是朋友關係,則可以換序.讓你給n個動物排序,希望盡可能按照字典序輸出所有動物 拓撲排序,由於兩個不是朋友關係 或者為同種動物 的兩個動物的前後相對位置是不會改變的 即 後面的動物不會排序到前面這個動物的前面 所以我們可以以此約束建立拓撲圖.遍歷...
python 拓撲排序 Python 拓撲排序
python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...
python 排序 拓撲排序
在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。如果圖是有向無環圖,則拓撲排序是可能的 為什麼不說一定呢?圖論 是組合數學的乙個分支,它和其他分支比如 群論 拓撲學 矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的...