有一張\(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 ...