20pts,求调,悬4关
查看原帖
20pts,求调,悬4关
658497
letianJOE楼主2025/7/22 10:24
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5;
const int mod=1e9+7;
int n,k;
int color[N+5]; //0是未上色,1是颜色1,2是颜色2,3是颜色3
vector<int>to[N+5];
int dp[N+5][5]; //以i为根节点,根节点上j色,将子树全部涂色的方案数,若根节点本来有上色,直接变成0
void dfs(int anc,int root)
{
    dp[root][1]=dp[root][2]=dp[root][3]=1;
    bool flag=1;
    for(auto v:to[root])
    {
        if(v==anc) continue;
        flag=0;
        dfs(root,v);
        dp[root][1]*=dp[v][2]+dp[v][3]%mod;
        dp[root][2]*=dp[v][1]+dp[v][3]%mod;
        dp[root][3]*=dp[v][2]+dp[v][1]%mod;
        dp[root][1]%=mod;
        dp[root][2]%=mod;
        dp[root][3]%=mod;
        if(color[root])
        {
            for(int i=1;i<=3;i++)
                if(i!=color[i])
                    dp[root][i]=0;
        }
    }
    if(flag)
    {
        // cout<<"jgvjkdbh\n";
        dp[root][1]=dp[root][2]=dp[root][3]=0;
        if(color[root]==0)
            dp[root][1]=dp[root][2]=dp[root][3]=1;
        else
            dp[root][color[root]]=1;
    }
}
signed main()
{
    cin>>n>>k;
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        cin>>u>>v;
        to[u].push_back(v),to[v].push_back(u);
    }
    for(int i=1;i<=k;i++)
    {
        int a,b;
        cin>>a>>b;
        color[a]=b;
    }
    dfs(1,1);
    // for(int i=1;i<=n;i++)
    // {
    //     for(int j=1;j<=3;j++)
    //         cout<<dp[i][j]<<" ";
    //     cout<<"\n";
    // }
    cout<<(dp[1][1]+dp[1][2]+dp[1][3])%mod;
    return 0;
}
2025/7/22 10:24
加载中...