日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ZJOI2015] 地震后的幻想乡(状压dp + 期望)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ZJOI2015] 地震后的幻想乡(状压dp + 期望) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

problem

luogu-P3343

solution

dp(i):dp(i):dp(i): 當恰好加入第 iii 小邊時候,所有點聯通的方案數。

ans=∑idpi(mi)im+1ans=\sum_i \frac{dp_i}{\binom mi}\frac{i}{m+1}ans=i?(im?)dpi??m+1i?

重點是如何計算出 dp(i)dp(i)dp(i)

這個恰好的限制不好搞。加第 iii 小的邊之前不能提前聯通,加后一定要聯通。

轉化一下,dp(i)=dp(i)=dp(i)= 加之前不連通的方案數 ?-? 加之后不連通的方案數。

f(s,i):sf(s,i):sf(s,i):s 點集中的點之間連了 iii 條邊后 sss 中的點仍然不連通的方案數。

g(s,i):sg(s,i):sg(s,i):s 點集中的點之間連了 iii 條邊后 sss 中的點聯通的方案數。

顯然 f(s,i)+g(s,i)=(cnt(s)i)f(s,i)+g(s,i)=\binom{cnt(s)}{i}f(s,i)+g(s,i)=(icnt(s)?),其中 cnt(s):cnt(s):cnt(s): 點集 sss 中的點之間的邊數。

轉移枚舉 sss 的子集 ttt,滿足 s&(?s)s\&(-s)s&(?s),即 sss 中最小元素點也在 ttt 集合內。
f(s,i)=∑(s&?s)∈t?s∑j=0ig(t,j)(s⊕ti?j)f(s,i)=\sum_{(s\&-s)\in t\subset s}\sum_{j=0}^ig(t,j)\binom{s\oplus t}{i-j} f(s,i)=(s&?s)t?s?j=0i?g(t,j)(i?jst?)
這種轉移相當于以 sss 中最小元素點為參考,其所在的聯通塊為 ttt,其余看作不連通,且 (s⊕ti?j)\binom{s\oplus t}{i-j}(i?jst?) 任意選的邊連出來的集合一定不與 ttt 有邊相連。這樣就不會算重了。

最后 dpi=f({1,2,...,n},i?1)?f({1,2,...,n},i)dp_i=f(\{1,2,...,n\},i-1)-f(\{1,2,...,n\},i)dpi?=f({1,2,...,n},i?1)?f({1,2,...,n},i)。

在代碼實現中統計答案略有不同,我是將這個式子稍微展開了一下。
ans=∑i=1mim+1f({1,2,...,n},i?1)?f({1,2,...,n},i)(mi)ans=\sum_{i=1}^m\frac{i}{m+1}\frac{f(\{1,2,...,n\},i-1)-f(\{1,2,...,n\},i)}{\binom mi} ans=i=1m?m+1i?(im?)f({1,2,...,n},i?1)?f({1,2,...,n},i)?
考慮相鄰兩位:
im+1f({1,2,...,n},i?1)?f({1,2,...,n},i)(mi)i+1m+1f({1,2,...,n},i)?f({1,2,...,n},i+1)(mi+1)\frac{i}{m+1}\frac{f(\{1,2,...,n\},i-1)-f(\{1,2,...,n\},i)}{\binom mi}\\ \frac{i+1}{m+1}\frac{f(\{1,2,...,n\},i)-f(\{1,2,...,n\},i+1)}{\binom m{i+1}} m+1i?(im?)f({1,2,...,n},i?1)?f({1,2,...,n},i)?m+1i+1?(i+1m?)f({1,2,...,n},i)?f({1,2,...,n},i+1)?
1m+1\frac{1}{m+1}m+11? 提出來,發現 i??f({1,2,...,n},i)i*-f(\{1,2,...,n\},i)i??f({1,2,...,n},i)(i+1)?+f({1,2,...,n},i)(i+1)*+f(\{1,2,...,n\},i)(i+1)?+f({1,2,...,n},i),相加其實就是加入了一次 f({1,2,...,n},i)f(\{1,2,...,n\},i)f({1,2,...,n},i)。

f({1,2,...,n},m)=0f(\{1,2,...,n\},m)=0f({1,2,...,n},m)=0,不可能所有邊都加完了還不聯通。

所以,有:
ans=1m+1∑i=0mf({1,2,...,n},i)(mi)ans=\frac{1}{m+1}\sum_{i=0}^m\frac{f(\{1,2,...,n\},i)}{\binom mi} ans=m+11?i=0m?(im?)f({1,2,...,n},i)?

code

#include <bits/stdc++.h> using namespace std; #define double long double #define int long long int n, m; int cnt[1 << 10]; double c[50][50]; int f[1 << 10][50], g[1 << 10][50]; struct node { int u, v; }E[50];signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= m;i ++ ) scanf( "%lld %lld", &E[i].u, &E[i].v );for( int s = 0;s < (1 << n);s ++ )for( int i = 1;i <= m;i ++ )if( (s >> E[i].u - 1 & 1) and (s >> E[i].v - 1 & 1) )cnt[s] ++;for( int i = 0;i <= m;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ ) c[i][j] = c[i - 1][j - 1] + c[i - 1][j];}for( int s = 0;s < (1 << n);s ++ )for( int i = 0;i <= cnt[s];i ++ ) {for( int t = s;t;t = (t - 1) & s )if( t & (s & -s) )for( int j = 0;j <= min( cnt[t], i );j ++ )f[s][i] += g[t][j] * c[cnt[s ^ t]][i - j];g[s][i] = c[cnt[s]][i] - f[s][i];}double ans = 0;for( int i = 0;i <= m;i ++ ) ans += 1.0 / (m + 1) * f[(1 << n) - 1][i] / c[m][i];printf( "%Lf\n", ans );return 0; }

總結

以上是生活随笔為你收集整理的[ZJOI2015] 地震后的幻想乡(状压dp + 期望)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。