10pts,救救孩子!
查看原帖
10pts,救救孩子!
878013
_Supernova楼主2023/12/6 22:36
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxN = 1e5 + 5, maxc = 6, p = 1e9 + 7;
ll N, K, x, y, col[maxN], b, c, dp[maxN][maxc], ans;
vector <ll> e[maxN];
void dfs(ll x, ll f) {
	if (col[x]) {
		dp[x][col[x]] = 1;
	}
	else {
		dp[x][1] = dp[x][2] = dp[x][3] = 1;
	}
	for (ll i = 0; i < e[x].size(); ++i) {
		ll nex = e[x][i];
		if (nex == f) {
			continue;
		}
		dfs(nex, x);
		dp[x][1] *= (((dp[nex][2] + dp[nex][3]) % p) % p);
		dp[x][2] *= (((dp[nex][1] + dp[nex][3]) % p) % p);
		dp[x][3] *= (((dp[nex][1] + dp[nex][2]) % p) % p);
	}
	return ;
}
int main(void) {
	scanf("%lld %lld", &N, &K);
	for (ll i = 1; i < N; ++i) {
		scanf("%lld %lld", &x, &y);
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for (ll i = 1; i <= K; ++i) {
		scanf("%lld %lld", &b, &c);
		col[b] = c;
	}
	dfs(1, 0);
	ans = max(dp[1][1], max(dp[1][2], dp[1][3])) % p;
	printf("%lld", ans);
	return 0;
}

思路和题解差不多,butbut why?why?

2023/12/6 22:36
加载中...