HDU5713 K個聯通塊

2022-05-20 05:35:09 字數 904 閱讀 1339

有一張\(n(n\le14)\)個點,\(m\)條邊無重邊的無向圖,求有多少個邊集,使得刪掉邊集裡的邊後,圖里恰好有\(k\)個連通塊。

乙個顯然的動態規劃是,\(f_\)表示點集為\(s\),分成\(i\)個連通塊的方案數。

轉移什麼的都很顯然,關鍵是如何求\(f_\)。(萬事開頭難!)

\(f_\)的含義是刪去\(s\)中若干條邊使得新圖仍然連通的方案數。我們可以將其轉化為任意刪邊的方案數-刪邊使得該圖不連通的方案數。

而後者就相對好求。

#include#include#include#include#includeinline int getint() 

typedef long long int64;

const int n=14,m=105,mod=1e9+9;

struct edge ;

edge e[m];

int f[1<>=1)

return ret;

}inline int inv(const int &x)

inline int lowbit(const int &x)

int main() }}

cnt[s]>>=1;

const int v=s^lowbit(s);

for(register int t=(v-1)&v;;t=(t-1)&v)

f[s][1]=(power(2,cnt[s])-f[s][1]+mod)%mod;

} for(register int j=2;j<=k;j++)

f[s][j]=(int64)f[s][j]*inv(j)%mod;

}} printf("case #%d:\n%lld\n",i,(int64)f[(1<} return 0;

}

第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 public string getpermutation int n,int k l...

第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...

第k個排列

給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...