拓撲排序 專題)

2021-10-05 22:27:07 字數 3911 閱讀 9766

解題報告:拓撲排序的板子題,不想說了。

解題報告:這道題看到第一反應是差分約束,然後拓撲排序也可以做,由於所有的邊都是大於0的,如果存在環一定無解(就是拓撲排序佇列長度不是n就說明存在環)。在建邊上,因為是最長路所以採用a>b+w,b向a連一條w的邊,然後從後往前找最長路,由於每個人獎金初始值都是100,不如把每個dist都變成1,由於求最小值,要找他的上界就等價於求最長路。最後把所有答案都加起來就是總共要發的錢了。

解題報告:這道題直接說了他是個dag圖,那直接topsort,然後問題就是如何找該點能到達的點數量呢,其實就是個dp的模型,逆序遍歷拓撲序,最後的終點肯定就只能到他自己,在遍歷i的時候要保證他後面的值都要算出來,所以採用逆序遍歷,f[i] |= f[j] ,這裡為了節約空間可以用個bitset來維護個數,1代表i能到某個位,0代表不能到,從後往前遍歷,f[i][i]=1,某個點肯定能到自己。

解題報告:這題雖然無頭緒,但是看完題解就知道了,這是個圖論的問題,從start到end之間,如果沒有停靠的點就是嚴格小於他們,可以從他們往右邊的點連一條長度為1的邊,但是這樣空間時間頂不住啊,大概有1e9條邊,這裡我們需要找乙個超級源點,作為中間點來節約空間,這樣就能優化成1e6條邊。然後拓撲排序一遍,把1~n的點變成1,這樣就能免去建乙個超級源點往所有點連一條1的邊的操作了。不能將1到n+m變成1,虛擬源點是不能變的,舉個hack例子吧,如果這個l到r的區間是完整的,那麼虛擬源點值是1,1+1可以更新dist的最大值為2,這樣肯定錯了。

#include

#include

using

namespace std;

const

int n=

2010

,m=1000010

;int h[n]

,e[m]

,idx,ne[m]

,w[m]

;int d[n]

;int n,m;

int dist[n]

;int q[n]

;bool st[n]

;void

add(

int a,

int b,

int c)

void

topsort()

while

(hh<=tt)}}

intmain()

for(

int j=start;j<=end;j++)if

(st[j]

)add

(n+i,j,1)

;else

add(j,n+i,0)

;}topsort()

;for

(int i=

1;i<=n+m;i++

) dist[i]=1

;for

(int i=

0;iint res=0;

for(

int i=

1;i<=n+m;i++

) res=

max(res,dist[i]);

cout<

return0;

}

拓撲排序模板專題

拓撲排序是對有向無環圖 dag 進行排序,從而找到乙個序列。該序列滿足對於任意一對不同的頂點u,v v,若g中存在一條從u v的邊,則在此序列中u在v前面。拓撲排序也可以用來判斷乙個有向圖是否存在環。有兩種演算法可以求得該序列 1.kahn演算法。其實就是不斷的尋找有向圖中沒有前驅 入度為0 的頂點...

python 拓撲排序 Python 拓撲排序

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

python 排序 拓撲排序

在電腦科學領域中,有向圖的拓撲排序是其頂點的先行排序,對於每個從頂點u到頂點v的有向邊uv,在排序的結果中u都在v之前。如果圖是有向無環圖,則拓撲排序是可能的 為什麼不說一定呢?圖論 是組合數學的乙個分支,它和其他分支比如 群論 拓撲學 矩陣論有著密切的關係。圖是圖論的主要研究物件。圖是由若干給定的...