python 拓撲排序解的個數

2021-09-11 08:49:23 字數 1862 閱讀 9544

給定有向無環圖中所有邊,計算圖的拓撲排序解的個數。

第一行為用例個數,後面每一行表示乙個圖中的所有邊,邊的起點和終點用空格隔開,邊之間使用逗號隔開。

拓撲排序解的個數。

1

a c,b c,c d,d e,d f,e g,f g

4
因為演算法課需要,所以只好將別人**進行翻譯,暫時還沒看懂原理。

**基本來自對【zju 1346 comparing your heroes 狀態壓縮dp 拓撲排序的計數】的翻譯,因為網上對拓撲排序計數的資料太少,所以我暫時用python進行了改寫。

需要對size進行修改,因為不知道輸入判例會有多少種字母,size=26的話會tle,size太小的話會re,經過我的測試,size=13時,size最小且能ac,說明測試用例的字母種數為13。

def

inputpre()

:global name, pre, m, n

for i in

range

(m):

v =0 u =

0while u < n:

if p[i][0

]== name[u]

:break

else

: u +=

1if u == n:[0

])n +=

1while v < n:

if p[i][1

]== name[v]

:break

else

: v +=

1if v == n:[1

])n +=

1 pre[v]|=

(1<< u)

defsolve()

:global dp, n

dp[0]

=1for s in

range(1

<< n)

:if dp[s]!=0

:for i in

range

(n):if(

(s & pre[i]

)== pre[i]

)and

not(s &(1

<< i)):

dp[s |(1

<< i)

]+= dp[s]

print

(dp[(1

<< n)-1

])if __name__ ==

'__main__'

: n =

int(

input()

)for k in

range

(n):

pairs =

list

(map

(str

,input()

.split(

",")))

# 起點終點對集合

m =len(pairs)

n =0 p =

# 儲存起點終點對

for i in

range

(m):

pair = pairs[i]

.split(

) name =

size =

13 pre =[0

for i in

range

(size)

] dp =[0

for i in

range(1

<< size)

] inputpre(

) solve(

)

python 拓撲排序 Python 拓撲排序

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

python 排序 拓撲排序

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

拓撲排序解成績排名問題

描述 2013 華為杯 南京郵電大學大學生團體歌唱大賽比賽形式為 大賽分為多輪,每一輪隨機選擇參賽團體進行兩兩pk賽。當根據多輪多場的pk賽成績能夠確定排名次序時,大賽結束。我們將問題進行簡化,從1開始按遞增順序給每乙個參賽團體分配乙個整數編號,每個參賽團體在比賽期間表現出的歌唱水平各不相同且穩定不...