60pts 求调 玄关
查看原帖
60pts 求调 玄关
1771965
tuxiaolai楼主2025/8/1 16:53
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
vector<int> adj[100010];
bool vis[100010];
int n,root,k;
int u,v;
long long dp[100010][4];
int c[100010];
void dfs(int p) {
    if(c[p]) {
        dp[p][c[p]]=1;
        for(int i:adj[p]) {
            if(vis[i]) {
                continue;
            }
            vis[i]=1;
            dfs(i);
            dp[p][c[p]]=dp[p][c[p]]*(dp[i][0]-dp[i][c[p]])%mod;
        }
        dp[p][0]=(dp[p][1]+dp[p][2]+dp[p][3])%mod;
        return ;
    }
    dp[p][1]=dp[p][2]=dp[p][3]=1;
    for(int i:adj[p]) {
        if(vis[i]) {
            continue;
        }
        vis[i]=1;
        dfs(i);
        for(int j=1; j<=3; j++) {
            dp[p][j]=dp[p][j]*(dp[i][0]-dp[i][j])%mod;
        }
    }
    dp[p][0]=(dp[p][1]+dp[p][2]+dp[p][3])%mod;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    root=1;
    cin>>n>>k;
    for(int i=1; i<n; i++) {
        cin>>u>>v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i=1; i<=k; i++) {
        cin>>u>>v;
        c[u]=v;
    }
    vis[root]=1;
    dfs(root);
    cout<<dp[root][0];
    return 0;
}

record

2025/8/1 16:53
加载中...