演算法導論 作業筆記

2021-08-08 19:38:51 字數 919 閱讀 5348

要求在乙個有向無環圖中,給定兩點,求出這兩點之間有多少條路徑

偽**:

list = topological_sort(g); 

create count[*] = 0;

count[s]=1

for each v in list

if(v!=t)

for each w in adj[v]

count[w] = count[w] + count[v];

else

break;

return count[t];

複雜度:

o(v+e)

先說結論: 對於有環圖,top排序不一定可以生成壞邊最小的序列

證明:假設g至少需要去掉k條邊才能變成無環圖,則任意序列p的壞邊數目bad[p] >= k;

證明: 如果存在p使得bad[p] < k, 則只要去掉p中的壞邊則剩下的必然為無環圖,這個和假設矛盾

推論:存在序列p使得bad[p]=k,去掉k條邊,然後top排序即可

對有環圖進行拓撲排序得到的序列p, bad[p]和反向邊數目相等

證明:有反向邊定義可證

需要證明反向邊數和k的關係,通過反例可證明反向邊樹可能大於k

dfs之後的樹為a–>b->c, 然後存在c->b, c->a兩條反向邊,但是實際上只要去掉b->c一條邊就可以變成無環圖

ps:其實直接通過反例證偽即可,上面的主要是記錄我思考的過程

思考:

初始時,所有入度為0的頂點入佇列

while佇列不為空,作以下處理:

取佇列頭結點,並出佇列

處理以頭結點為起點的所有的邊,將邊的終點的入度-1

若入度減為0,則入佇列

若g中包含迴路:找不到入度為0的點,且g中仍然還有節點沒有刪除(剩下的就是g的迴路)

演算法導論 作業筆記

要求在乙個有向無環圖中,給定兩點,求出這兩點之間有多少條路徑 偽 list topological sort g create count 0 count s 1 for each v in list if v t for each w in adj v count w count w count ...

《演算法導論》筆記彙總

列表裡沒有的,或者是純屬理論,不適合寫,比如第1 5章 或者是我也不怎麼明白的,比如斐波那契堆中抽取最小結點的平攤代價分析 還有沒看的,比如數論和np完全性等。陸續看了四個月,有些理解的還不是很深,筆記彙總到這裡。如果有問題,可以郵件交流。第六章 堆排序 堆排序 第七章 快速排序 四種快速排序 快速...

《演算法導論》筆記 前言

演算法導論 應該是每乙個程式設計師都應該看的經典吧。不過現在這個時代,設計重於資料結構和演算法,乙個普通程式設計師,只要會用api sdk,再學一點軟體工程思想,就足夠應付日常工作了。在很多人眼中,演算法的研究只是一小撮人做的事,他們為我們提供底層工具,我們在其基礎上搭建面對使用者的應用程式,而應用...