拓撲排序總結

2021-09-29 11:13:20 字數 1842 閱讀 6551

問題分析 怎麼說呢 拓撲排序 給我的感覺就是 一棵樹 從樹冠 往下

每次遇到 比他的小的 就把它的入度+1 就往樹下 走 然後從樹冠 找

入度為0 是就是乙個 小樹冠 其下擁有若干 小樹 小分支的入度為0 意味著到了

小樹冠的底部但著並不意味著 這就是最小值 因為 可能還有比這個數的最大入度

還大的數存在

為了滿足 不確定的 名次按照 隊伍字典序排序

借助於優先佇列來實現這個; 首先將 起始入度為0 的隊伍加入 這意味著 樹冠 (他們的 名詞相對來說是靠前的單不能確定他們的具體名詞 優先佇列巴拉巴拉…)

然後 出隊 掃瞄 分支 入度減一 存在 入度為0 就繼續加入優先佇列

具體**如下:

#include

#include

#include

#include

#define mem(a) memset(a,0,sizeof(a))

using

namespace std;

int n,m,map[

505]

[505

],in[

505]

;int

main()

} priority_queue<

int,vector<

int>

,greater<

int>

> q;

for(

int i=

1;i<=n;i++

)bool f=0;

while

(q.size()

)}} cout<}return0;

}

問題分析 :

和上個 拓撲排序一樣只不過是是反向查詢 是否是存在迴圈結構 如果 存在就意味這有錯誤

而這在 程式中反映出來就是 查詢值等於n;

具體**如下:

#include

#include

#include

#include

#define mem(a) memset(a,0,sizeof(a))

using

namespace std;

int n,m,map[

505]

[505

],in[

505]

;int

main()

}int flag=0;

int i,j;

for( i=

0;i)break;}

}if(j==n)}if

(flag)

cout<<

"no\n"

;else

cout<<

"yes\n";}

return0;

}

就是拓撲排序 中間 加了乙個 一888作為基值

**如下:

#include

#include

#include

#include

#define mem(a) memset(a,0,sizeof(a))

using

namespace std;

intmain()

for(

int i=

1;i<=n;i++)if

(!in[i]

)int tot=0;

int sum=0;

while

(!q.

empty()

)}if(totcout<<-1

cout<}return0;

}

拓撲排序總結

拓撲排序主要的作用是可以用來判斷,當前圖中是否含有環。其主要的實現思想是,從圖中的入度為零的點開始,如果找到,就將這個點從圖中刪去,並更新與這個點相連的其他點的入度資訊,直到全部的點都被刪去,或者圖中沒有入度為零的點,如果是後一種情況,那麼證明圖中含有環。的實現具體如下 include using ...

總結 拓撲排序

dm vincent的專欄 某推酷總結 最近花了一點點時間學了拓撲排序,感覺到圖論真是神奇。總的來說,拓撲排序的題還是有一定的靈活度的,除去一些比較水的題,很容易跟其他演算法或者資料結構混在一起,一下子難度就上去了,也從單一的模板的題變為了多重模板題或者智力題。拓撲排序比較好理解,就是建立有向圖,每...

python 拓撲排序 Python 拓撲排序

python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...