Niu Ke Practice 62 C- Niu Niu tingido de cor (árvore dp)

Significado da pergunta:
Dada uma árvore, há uma restrição para tingir os pontos na árvore de branco ou preto. A cor de quaisquer dois pontos pretos também deve ser preta. Encontre o número de esquemas de tingimento.
Solução:
Deixe dp [i] denotar o número de esquemas com pelo menos um ponto preto na subárvore com i como o nó raiz, e o conjunto vazio é dp [i] +1
1. Se o ponto u for um ponto preto, então como os nós filhos são coloridos Sim, dp [u] = ∏ (dp [v] +1)
2. Se u for um ponto branco, então o nó filho tem pelo menos um ponto preto, dp [u] + = dp [v] A
resposta final é ans = dp [1] +1;
Código:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int mod=1e9+7;
const int MAXN=1e6+5;
int head[MAXN];
int cnt=0;
ll dp[MAXN];
struct node
{
    
    
    int to;
    int next;
}e[MAXN<<1];
void add(int u,int v)
{
    
    
    e[cnt].to=v;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(int u,int f)
{
    
    
    ll sum1=1;
    ll sum2=0;
    for(int i=head[u];i!=-1;i=e[i].next)
    {
    
    
        int v=e[i].to;
        if(v==f) continue;
        dfs(v,u);
        sum1=sum1*(dp[v]+1)%mod;
        sum2=(sum2+dp[v])%mod;
    }
    dp[u]=sum1;
    dp[u]=(dp[u]+sum2)%mod;
}
int main()
{
    
    
    int n;
    cin>>n;
    memset(head,-1,sizeof head);
    int u,v;
    for(int i=1;i<=n-1;i++)
    {
    
    
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(1,-1);
    ll ans=(dp[1]+1)%mod;
    printf("%lld\n",ans);
}



Acho que você gosta

Origin blog.csdn.net/weixin_45755679/article/details/109098230
Recomendado
Clasificación