time limit: 10 sec memory limit: 128 mb
submit: 544 solved: 354
[submit][status][discuss]
小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1..n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地來往。一對城市之間可能存在多條道路。
據史料記載,這個文明的交通網路滿足兩個奇怪的特徵。首先,這個文明崇拜數字k,所以對於任何一條道路,設它連線的兩個城市分別為u和v,則必定滿足1 <=|u - v| <= k。此外,任何乙個城市都與恰好偶數條道路相連(0也被認為是偶數)。不過,由於時間過於久遠,具體的交通網路我們已經無法得知了。小宇很好奇這n個城市之間究竟有多少種可能的連線方法,於是她向你求助。
方法數可能很大,你只需要輸出方法數模1000000007後的結果。
輸入共一行,為3個整數n,m,k。
輸出1個整數,表示方案數模1000000007後的結果。
【輸入樣例1】
3 4 1
【輸入樣例2】
4 3 3
【輸出樣例1】
3【輸出樣例2】
4【資料規模】
100%的資料滿足1<= n <= 30, 0 <= m <= 30, 1 <= k <= 8.
【題目說明】
兩種可能的連線方法不同當且僅當存在一對城市,它們間的道路數在兩種方法中不同。
在交通網路中,有可能存在兩個城市無法互相到達。
分析:狀壓dp好題!
這道題還是挺容易看出來用狀壓dp做的.因為是無向邊,誰連向誰不重要,重要的是這條邊連的兩個點是什麼.將點按照編號排序,那麼對於第i個點,只需要考慮連向它前面的k個點就可以了.
於是可以想到狀態表示:f[i][j][k]表示前i個點中連了j條邊,第i個點前k個點(包括點i)的狀態為k的方案數.k是乙個二進位制數,位上是0則表示那個點的度數為偶數,否則為奇數.最後合法的狀態就是0了.
這個狀態不好轉移,因為第i個點連向哪些點,連多少條邊不知道,怎麼辦,列舉?這其實是乙個分配問題,利用dp解決.再加一維:f[i][j][k][l]表示前i個點中連了j條邊,第i個點前k個點(包括點i)的狀態為k,i向之前的點連邊已經考慮到了第i-k+l個點的方案數.這樣就很好轉移了:如果i要繼續向第i-k+l個點連邊,則l不動就好了,轉移到j+1,k也要改變,否則轉移到l+1.
這道題的細節挺多的.考慮第i個點連邊不僅要考慮被連的點的度數的變化,還要考慮第i個點的度數的變化. 每次從i轉移到i+1時,要保證之前的狀態合法,也就是狀態左移的時候,要保證第i-k個點的度數為0,因為以後就不考慮這個點了.運算子優先順序要弄清楚!
#include #include#include
#include
using
namespace
std;
const
int mod = 1000000007
;int n,m,k,f[40][40][1
<< 9][10
],maxn;
intmain()
}if (((k & (1
<< k)) == 0) &&f[i][j][k][k])
}printf(
"%d\n
",f[n + 1][m][0][0
]); //最後答案都會匯集到一點上
return0;
}
BZOJ3195 Jxoi2012 奇怪的道路
time limit 10 sec memory limit 128 mb 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1.n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地...
bzoj3195 Jxoi2012 奇怪的道路
題目鏈結 一張 n 個點 m 條邊的無向圖,每個點度數為偶數,乙個點只能向標號與它的差不超過 k 的點連邊,問構圖方案。三維狀態搞了半天的我眼淚掉下來t t f i j s l 表示,前 i 個點,已經連了 m 條邊,第 i k 個點到第 i 個點的狀態為 s 當前討論 i 與 i k l 的連邊情...
bzoj 3195 奇怪的道路 狀壓dp
看範圍,狀壓沒毛病 但是如果隨便連的話給開1 16,乘上n,m就爆了 所以規定轉移時只向回連邊 於是想狀態陣列 f i j 表示到i這裡i前k位的狀態為j 表示奇偶 發現有條數限制,但是n,m,2 k都比較小,加一維,f i j k 表示前i位,用j條路,i前的k位狀態為j 轉移的話,因為1 u v...