“今日头条杯”首届湖北省大学程序设计竞赛 D. Who killed Cock Robin

D. Who killed Cock Robin

题目链接

题意:给出一颗树,求它的所有子树的总数。

思路:定义一个dp[],dp[u]是指以u为结点的子树的个数。

         可以推出:对于u所有的直接子节点v,dp[u]=dp[u]*(dp[v]+1);

         可以理解为(dp[v]+1)是在v结点形成的所有子树中加入一个u结点这样形成的一定含有u结点的子树总数。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
const int INF=int(1e9);
const int mod=10000007;
#define ll long long
vector<int>edge[maxn];
bool vis[maxn];
ll dp[maxn];
void init(int n) {
	for(int i=0; i<=n; i++)
		edge[i].clear();
	memset(vis,0,sizeof(vis));

}
void dfs(int u) {
	vis[u]=true;
	dp[u]=1;
	for(int i=0; i<edge[u].size(); i++) {
		int v=edge[u][i];
		if(vis[v])
			continue;
		dfs(v);
		dp[u]=dp[u]*(dp[v]+1)%mod;
	}
	return;
}
int main() {
	int n;
	int u,v;
	scanf("%d",&n);
	init(n);
	for(int i=1; i<=n-1; i++) {
		scanf("%d %d",&u,&v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	dfs(1);
	ll ans=0;
	for(int i=1; i<=n; i++)
		ans=(ans+dp[i])%mod;
	printf("%lld\n",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40160605/article/details/80048479