給定有向無環圖中所有邊,計算圖的拓撲排序解的個數。
第一行為用例個數,後面每一行表示乙個圖中的所有邊,邊的起點和終點用空格隔開,邊之間使用逗號隔開。
拓撲排序解的個數。
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開始按遞增順序給每乙個參賽團體分配乙個整數編號,每個參賽團體在比賽期間表現出的歌唱水平各不相同且穩定不...