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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P3349-[ZJOI2016]小星星【树形dp,容斥】

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3349-[ZJOI2016]小星星【树形dp,容斥】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3349


題目大意

nnn個點的一棵樹,再給出一張圖,樹上每個點對應圖上每個點后要求樹上的邊圖上都有,求有多少種對應方式。


解題思路

由于題目要求每個點只出現一次就加大了難度,可以考慮用容斥去掉這個限制。如果至少有kkk個點重復出現過,那么這種情況的容斥系數就為(?1)k(-1)^k(?1)k
我們可以枚舉一個集合sss,那么sss中的所有點都不選,那么就至少會有∣s∣|s|s個點重復,容斥系數就為(?1)∣s∣(-1)^{|s|}(?1)s。然后上dpdpdp即可,這樣的時間復雜度大概是O(n∑s∈G∣s∣2)O(n\sum_{s\in G}|s|^2)O(nsG?s2)

計算下來大概是1e71e71e7級別的,可以通過本題。


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=18; struct node{ll to,next; }a[N*2]; ll n,m,tot,s,ans,ls[N],f[N][N]; bool v[N][N]; void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return; } void dfs(ll x,ll fa){for(ll p=0;p<n;p++)if(!((1<<p)&s))f[x][p]=1;else f[x][p]=0;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dfs(y,x);for(ll p=0;p<n;p++){ll tmp=0;if(s&(1<<p))continue;for(ll q=0;q<n;q++)tmp+=f[y][q]*v[p][q];f[x][p]*=tmp;}}return; } int main() {scanf("%lld%lld",&n,&m);ll MS=(1<<n);for(ll i=1;i<=m;i++){ll x,y;scanf("%lld%lld",&x,&y);x--;y--;v[x][y]=v[y][x]=1;}for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);x--;y--;addl(x,y);addl(y,x);}for(s=0;s<MS;s++){dfs(0,0);ll tmp=0;for(ll i=0;i<n;i++)tmp+=f[0][i];ll w=s,z=1;while(w)w-=(w&-w),z=-z;ans+=z*tmp;}printf("%lld\n",ans); }

總結

以上是生活随笔為你收集整理的P3349-[ZJOI2016]小星星【树形dp,容斥】的全部內容,希望文章能夠幫你解決所遇到的問題。

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