Independent Set

Independent Set

给一棵树,每一个点可以染成黑色或白色,任意两个相邻节点不能都是黑色,求方案数,结果对 109+7 取模。

样例输入

3
1 2
2 3

样例输出

5

树形DP:

我们设状态 dpi,0/1 为以 i 为根节点,且根节点颜色为( 10 )的子树中染色的方案数,那么可得状态转移方程为:

i 节点为白色时:

dpi,0=(dptoi,0+dptoi,1)

为黑色时:

dpi,1=dptoi,0

状态初始化:

显然,当 i 节点为根节点时,dpi,0=dpi,1=1

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 7;
const int MOD = 1e9 + 7;
vector<int> tree[MAXN];
long long dp[MAXN][2];
int n;
int x,y;
void dfs(int pos,int fa){
	int cnt = 0;
	for(int to : tree[pos]){
		if(to != fa){
			cnt++;
			dfs(to,pos);
			dp[pos][1] = (dp[pos][1] * dp[to][0]) % MOD;
			dp[pos][0] = (dp[pos][0] * (dp[to][1] + dp[to][0]) % MOD) % MOD;
		}
	}
	if(cnt == 0){
		dp[pos][0] = dp[pos][1] = 1;
	}
}
int main(){
	scanf("%d", &n);
	for(int i = 1;i <= n;i++){
		dp[i][0] = dp[i][1] = 1;
	}
	for(int i = 1;i <= n - 1;i++){
		scanf("%d%d", &x, &y);
		tree[x].push_back(y);
		tree[y].push_back(x);
	}
	dfs(1,0);
	cout<<(dp[1][0] + dp[1][1]) % MOD;
	return 0;
}

done

posted @   wyl123ly  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示