bzoj3195 Jxoi2012 奇怪的道路

2022-05-21 13:21:15 字數 1179 閱讀 7931

(題目鏈結)

一張$n$個點$m$條邊的無向圖,每個點度數為偶數,乙個點只能向標號與它的差不超過$k$的點連邊,問構圖方案。

三維狀態搞了半天的我眼淚掉下來t_t

$f[i][j][s][l]$表示,前$i$個點,已經連了$m$條邊,第$i-k$個點到第$i$個點的狀態為$s$,當前討論$i$與$i-k+l$的連邊情況。

如果$i$與$i-k+l$不連邊。$$f[i][j][s][l+1]+=f[i][j][s][l]$$

如果$i$與$i-k+l$連邊。$$f[i][j+1][s*bin[l]*bin[k]][l+1]+=f[i][j][s][l]$$

跳到下乙個$i$,當且僅當$i-k$度數為偶數時可行,因為之後就不會再有節點能夠跟$i-k$連邊了。$$f[i+1][j][s>>1][0]+=f[i][j][s][k]$$

邊界什麼的處理好

// bzoj3195

#include#include#include#include#include#include#define ll long long

#define inf (1ll<<30)

#define mod 1000000007

#define pi acos(-1.0)

#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);

using namespace std;

int f[32][32][1<<9][9],bin[30];

int n,m,k;

int main()

else if (n==1)

bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;

f[2][0][0][0]=1;

for (int i=2;i<=n;i++)

for (int j=0;j<=m;j++)

for (int k=0;k0) (f[i][j+1][k^bin[l]^bin[k]][l]+=f[i][j][k][l])%=mod;

}if (!(1&k)) (f[i+1][j][k>>1][0]+=f[i][j][k][k])%=mod;

}printf("%d",f[n+1][m][0][0]);

return 0;

}

BZOJ3195 Jxoi2012 奇怪的道路

time limit 10 sec memory limit 128 mb 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1.n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地...

bzoj3195 Jxoi2012 奇怪的道路

time limit 10 sec memory limit 128 mb submit 544 solved 354 submit status discuss 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為...

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