奇怪的道路(狀壓)

2022-05-11 03:22:33 字數 1471 閱讀 7556

時間限制: 1 sec  記憶體限制: 128 mb

小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有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.

【題目說明】

兩種可能的連線方法不同當且僅當存在一對城市,它們間的道路數在兩種方法中不同。

在交通網路中,有可能存在兩個城市無法互相到達。

這道題開始想到的是用組合數的方法,然後dfs列舉每種組合,但是總是發現沒有辦法處理重邊,之後題解告訴我,這是乙個狀壓(看資料範圍也應該想到但是卻沒想到),之後狀壓的話就可以用f[i][j][k]表示地i位,用了j條邊是,包括i這個點前k位的狀態,0表示是偶數,而1表示為奇數。在轉移的時候,f[i]...可以有f[i-1]..轉移過來,也可以用新的邊,更新當前的狀態,所以分兩部分轉移,但是在從f[i-1]..轉移的時候要保證最遠的哪一位是偶數,因為第i點不能與最遠的點建立邊。之後再在第i位建邊就行了,但是在建邊的時候要保證先列舉建立哪一條邊,以為在剛開始的時候,任何乙個點與i都是沒有的,用這樣的方法就能夠保證建邊的順序,不會建重,而要是最裡層列舉建哪一條邊的話,可能一種相同的情況卻按照不同的順序建了兩遍。

另外在建邊的時候要保證不出邊界;

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9int mo=1000000007;10

int f[31][31][600

];11

intn,m,k;

12int

main()26}

27for(int h=k-1;h>=0;h--)34}

35}36}

37 cout<0]<38return0;

3940 }

奇怪的道路 狀壓DP

小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1.n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地來往。一對城市之間可能存在多條道路。據史料記載,這個文明的交通網路滿足兩個奇...

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...

狀壓DP 奇怪的東西

狀態壓縮動態規劃 簡稱狀壓dp 是非常典型的一類dp。他是利用二進位制來描述狀態的一種dp方式,大家都知道,dp是解決多階段決策最優化問題的思想方法,但是有時候階段多了,維度多了,陣列也就爆了,因為雖然維度多,但是有些空間可能用不到,這就很浪費了,主要是維度多了處理麻煩很噁心 所以我們就把我們就把一...