f[x][0]表示與其父邊相連的連通塊內沒有黑蘋果的方案數,
f[x][1]則表示有黑蘋果,
如果父邊被切斷,相當於沒有黑蘋果
初始化時,假設切掉父邊,f[x][0]=1,f[x][1]=0;
遞迴回時轉移,每遞迴回乙個子樹,f[x][1]=f[x][1]*f[v][0]+f[x][0]*f[v][1],f[x][0]=f[x][0]*f[v][0];
最後處理完每個子樹時,若其為黑蘋果f[x][1]=f[x][0],否則f[x][0]=f[x][0]+f[x][1](可以切掉)
#include#include#include#include#include#define n 100050#define mod 1000000007ll
using namespace std;
int n,c[n],fa[n];
long long f[n][2];
int e=1,head[n];
struct edgeed[2*n];
void add(int u,int v)
void dfs(int x)
if(c[x]) f[x][1]=f[x][0];
else f[x][0]=(f[x][0]+f[x][1])%mod;
}int main()
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
dfs(1);
printf("%lld\n",f[1][1]);
return 0;
}
繁華模擬賽 Evensgn 剪樹枝
繁華中學有一棵蘋果樹。蘋果樹有 n 個節點 也就是蘋果 n 1 條邊 也就 是樹枝 調皮的 evensgn 爬到蘋果樹上。他發現這棵蘋果樹上的蘋果有兩種 一 種是黑蘋果,一種是紅蘋果。evensgn 想要剪掉 k 條樹枝,將整棵樹分成 k 1 個 部分。他想要保證每個部分裡面有且僅有乙個黑蘋果。請問...
概率 樹規 熟練剖分
根節點不一定是1,但是是乙個確定的點,看誰不是兒子就行了。這道題我們考慮從兒子推到根。設f i j 表示以i為根的子樹中,最長輕鏈長度為j的概率。因為每乙個son被選為重兒子的概率相同,且重兒子對父親貢獻和輕兒子不同,所以要每乙個點為重兒子,之後挨個列舉每個兒子。這個效率是n 2,然後要列舉鏈的長度...
LA3942 背單詞 trie樹 簡單動規)
問題描述 給出乙個由s個不同單詞組成的字典和乙個長字串。把這個字串分解成若干個單詞的連線 單詞可以重複使用 有多少種方法?比如4個單詞 則 abcd 有兩種分解方法 a b cd 或 ab cd 輸入格式 第一行為長字串 僅由小寫字母組成 第二行乙個整數n,表示字典包含的單詞數。以下n行,每行為乙個...