沼泽鳄鱼_SSL2511_矩阵乘法
沼澤鱷魚
【題目描述】
潘塔納爾沼澤地號稱世界上最大的一塊濕地,它地位于巴西中部馬托格羅索州的南部地區。每當雨季來臨,這里碧波蕩漾、生機盎然,引來不少游客。
為了讓游玩更有情趣,人們在池塘的中央建設了幾座石墩和石橋,每座石橋連接著兩座石墩,且每兩座石墩之間至多只有一座石橋。這個景點造好之后一直沒敢對外開放,原因是池塘里有不少危險的食人魚(不是說鱷魚咩~_~)。
豆豆先生酷愛冒險,他一聽說這個消息,立馬趕到了池塘,想做第一個在橋上旅游的人。雖說豆豆愛冒險,但也不敢拿自己的性命開玩笑,于是他開始了仔細的實地勘察,并得到了一些驚人的結論:食人魚的行進路線有周期性,這個周期只可能是2,3或者4個單位時間。每個單位時間里,食人魚可以從一個石墩游到另一個石墩。每到一個石墩,如果上面有人它就會實施攻擊,否則繼續它的周期運動。如果沒有到石墩,它是不會攻擊人的。
借助先進的儀器,豆豆很快就摸清了所有食人魚的運動規律,他要開始設計自己的行動路線了。每個單位時間里,他只可以沿著石橋從一個石墩走到另一個石墩,而不可以停在某座石墩上不動,因為站著不動還會有其它危險。如果豆豆和某條食人魚在同一時刻到達了某座石墩,就會遭到食人魚的襲擊,他當然不希望發生這樣的事情。
現在豆豆已經選好了兩座石墩Start和End,他想從Start出發,經過K個單位時間后恰好站在石墩End上。假設石墩可以重復經過(包括Start和End),他想請你幫忙算算,這樣的路線共有多少種(當然不能遭到食人魚的攻擊)。
?
【輸入文件】
輸入文件共M + 2 + NFish行。
第一行包含五個正整數N,M,Start,End和K,分別表示石墩數目、石橋數目、Start石墩和End石墩的編號和一條路線所需的單位時間。石墩用0到N–1的整數編號。
第2到M + 1行,給出石橋的相關信息。每行兩個整數x和y,0 ≤ x, y ≤N–1,表示這座石橋連接著編號為x和y的兩座石墩。
第M + 2行是一個整數NFish,表示食人魚的數目。
第M + 3到M + 2 + NFish行,每行給出一條食人魚的相關信息。每行的第一個整數是T,T = 2,3或4,表示食人魚的運動周期。接下來有T個數,表示一個周期內食人魚的行進路線。
? ? ? 如果T=2,接下來有2個數P0和P1,食人魚從P0到P1,從P1到P0,……;
? ? ? 如果T=3,接下來有3個數P0,P1和P2,食人魚從P0到P1,從P1到P2,從P2到P0,……;
? ? ? 如果T=4,接下來有4個數P0,P1,P2和P3,食人魚從P0到P1,從P1到P2,從P2到P3,從P3到P0,……。
豆豆出發的時候所有食人魚都在自己路線上的P0位置,請放心,這個位置不會是Start石墩。
?
【輸出文件】
輸出路線的種數,因為這個數可能很大,你只要輸出該數除以10000的余數就行了。
?
【約定】
???????1 ≤ N ≤50
???????1 ≤ K ≤2,000,000,000
???????1 ≤NFish ≤ 20
?
【樣例輸入】
6 8 1 5 3
0 2
2 1
1 0
0 5
5 1
1 4
4 3
3 5
1
3 0 5 1
?
【樣例輸出】
2
?
【樣例說明】
| 時刻 | 0 | 1 | 2 | 3 |
| 食人魚位置 | 0 | 5 | 1 | 0 |
| 路線一 | 1 | 2 | 0 | 5 |
| 路線二 | 1 | 4 | 3 | 5 |
【解題思路】
知識點:
圖鄰接矩陣上的乘法
圖的鄰接矩陣可以唯一地表示一張圖,并且有很多神奇的性質。
首先,我們來看一下最簡單的情況,一張N個點的無向無權圖。如果點a和點b連邊,那么鄰接矩陣G[a,b]=G[b,a]=1,否則都等于0。
考慮鄰接矩陣自乘,即G2=G*G(矩陣乘法)可以得出結論,G^k[a,b]就等同a到b經過k-1個中間點也就是長度為k的路徑條數。
那么對于有重邊的圖,我們只需要把G[a,b]改為表示點a、b之間重邊的條數即可。
而對于有向圖的自環不需要特殊考慮。
對于無向圖的自環,我們通常是把G[a,a]加上2,這樣在計算Gk的時候這條邊就被算成2條不同的邊,如果只加上1,又會不滿足矩陣里所有元素和等于邊數兩倍的性質。
考慮這個問題,假設沒有食人魚,那么這道題目就變成了上述所說的求由a到b長度為k的路徑條數,即求連接矩陣G^k[a,b]。
再考慮有食人魚的情況:
圖鄰接矩陣上的乘法有食人魚和沒有食人魚的區別就在于,前者的圖是不斷在變化,而后者的圖始終是不變的。
設Gi表示把與時刻i不能經過的點相關的邊都去掉以后的圖。相乘同樣可以得到最終時刻的答案矩陣Gk*Gk-1*Gk-2....*G1。
那么這樣就是最優解了嗎?
觀察題目數據范圍可以發現,2≤T≤4,2、3、4的最小公倍數為12,則最多沒12單位時間為一個周期,所以我們只用考慮12單位時間內的各連接矩陣即可。
但是注意到k不一定是12的倍數,所以k mod 12也就是最后未滿一個周期的時間,我們可以單獨相乘,前面周期計算采用快速冪,這樣間復雜度為O(N2logK)
【源代碼】/pas
轉載于:https://www.cnblogs.com/olahiuj/p/5781346.html
總結
以上是生活随笔為你收集整理的沼泽鳄鱼_SSL2511_矩阵乘法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: addHeaderView()异常 ——
- 下一篇: 在pcduino上实现图像识别的程序