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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #630 (Div. 2) F. Independent Set 树形dp

發(fā)布時(shí)間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #630 (Div. 2) F. Independent Set 树形dp 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳送門

文章目錄

  • 題意:
  • 思路:

題意:

給你一棵樹,求這棵樹的邊導(dǎo)出子圖中獨(dú)立集的數(shù)量和,獨(dú)立集大小可以為000

思路:

先考慮普通的獨(dú)立集數(shù)量怎么求,無非就是分情況討論一下選根還是不選根,而這個(gè)題多了一個(gè)邊導(dǎo)出子圖的條件,那么無非就是多了一個(gè)選擇,那就是切掉根與其兒子的邊,所以直接考慮類似的dpdpdp多加一個(gè)切邊的操作就好啦。
定義f[i][j]f[i][j]f[i][j]表示到以iii為根的子樹,狀態(tài)為jjj的時(shí)候的獨(dú)立集個(gè)數(shù)。
f[i][0]f[i][0]f[i][0]表示iii可以選也可以不選,并且iii與其父親節(jié)點(diǎn)之間的邊不選。
f[i][1]f[i][1]f[i][1]表示選iii這個(gè)點(diǎn),并且iii與其父親之間有邊。
f[i][2]f[i][2]f[i][2]表示不選iii這個(gè)點(diǎn),并且iii與其父親之間有邊。
這個(gè)題主要是難在狀態(tài)的設(shè)計(jì)上,我們?cè)O(shè)計(jì)出狀態(tài)來轉(zhuǎn)移就比較好想了。
(1)j=1(1)j=1(1)j=1時(shí),由于選了iii這個(gè)點(diǎn),所以要不就斷掉iii與他兒子的邊,要不就加上與他兒子的邊并且不選他兒子。f[i][1]=∏(f[j][0]+f[j][2])f[i][1]=\prod (f[j][0]+f[j][2])f[i][1]=(f[j][0]+f[j][2])
(2)j=2(2)j=2(2)j=2時(shí),由于沒選iii這個(gè)點(diǎn),那么他與兒子之間的關(guān)系隨意。f[i][2]=∏(f[j][0]+f[j][1]+f[j][2])f[i][2]=\prod (f[j][0]+f[j][1]+f[j][2])f[i][2]=(f[j][0]+f[j][1]+f[j][2])
(3)j=3(3)j=3(3)j=3時(shí),顯然f[i][0]=f[i][1]+f[i][2]f[i][0]=f[i][1]+f[i][2]f[i][0]=f[i][1]+f[i][2],但是這樣就行了嗎?要知道f[i][1]+f[i][2]f[i][1]+f[i][2]f[i][1]+f[i][2]是包含了與iii的兒子之間的邊都不選的情況,我們現(xiàn)在與iii的父親之間的邊也不選了,那么iii這個(gè)點(diǎn)不就被孤立了嗎?但是邊導(dǎo)出子圖是肯定不能有孤立的點(diǎn)的,所以我們要減去∏f[j][0]\prod f[j][0]f[j][0]f[i][0]=f[i][1]+f[i][2]?∏f[j][0]f[i][0]=f[i][1]+f[i][2]-\prod f[j][0]f[i][0]=f[i][1]+f[i][2]?f[j][0]
最終的答案即為f[1][0]?1f[1][0]-1f[1][0]?1,因?yàn)椴荒苓x的邊集為空集。

// Problem: F. Independent Set // Contest: Codeforces - Codeforces Round #630 (Div. 2) // URL: https://codeforces.com/contest/1332/problem/F // Memory Limit: 512 MB // Time Limit: 2000 ms // // Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid (tr[u].l+tr[u].r>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=1000010,mod=998244353,INF=0x3f3f3f3f; const double eps=1e-6;int n; vector<int>v[N]; LL f[N][3]; // 0 選不選都行 但是與父親之間沒邊 // 1 選這個(gè)點(diǎn) 但是與父親之間有邊 // 2 不選這個(gè)點(diǎn) 但是與父親之間有邊void dfs(int u,int fa) {LL fun=1;for(auto x:v[u]) {if(x==fa) continue;dfs(x,u);(f[u][1]*=(f[x][0]+f[x][2])%mod)%=mod;(f[u][2]*=(f[x][0]+f[x][1]+f[x][2])%mod)%=mod;(fun*=f[x][0])%=mod;}f[u][0]=((f[u][1]+f[u][2]-fun)%mod+mod)%mod;//由于如果他的到葉子的邊都不選的而且u選的話,那么就是一個(gè)孤立的點(diǎn)了,這是不允許的 }int main() { // ios::sync_with_stdio(false); // cin.tie(0);scanf("%d",&n);for(int i=1;i<=n-1;i++) {int a,b; scanf("%d%d",&a,&b);v[a].pb(b); v[b].pb(a);}for(int i=1;i<=n;i++) f[i][1]=f[i][2]=1;dfs(1,0);printf("%lld\n",((f[1][0]-1)%mod+mod)%mod);//減去空集的情況return 0; } /**/ 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Codeforces Round #630 (Div. 2) F. Independent Set 树形dp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。