2018今日头条湖北省赛【D】

【题目链接】https://www.nowcoder.com/acm/contest/104/C

不知道这题为啥没过。队友现场推的都是对的。。233333好像代码写的有问题,下来就很恼火。

题意大概就是统计不同连同子图的个数。

dp公式 dp[i] = ∏(j是i的儿子)(dp[j]+1)

答案就是∑dp[i]

对于下面的代码有几点想说的。

首先是,一定要用long long 啊QAQ。然后就是一定要时刻记得mod啊QAQ。

dfs里面是求dp[i]的值的。逻辑就是看是否有访问当前这个数,没有的话就接着往下算乘积,并继续dfs该点,向下找。

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define ll long long 
const ll Max = 2*1e5+10;
const ll mod = 1e7+7;


vector<ll> a[Max];
ll vis[Max];
ll dp[Max];


void dfs(ll num){
    vis[num] = 1;
    ll ans = 1;
    ll len = a[num].size();
    for(int i = 0 ;i < len ;i++){
        if(vis[a[num][i]]){
            continue;
        }
        
        dfs(a[num][i]);     
        ans *= (dp[a[num][i]]+1) ;
        ans %= mod;
    }    
    dp[num] = ans;
}

int main(){
    ll n;
    scanf("%lld",&n);
    ll x,y;
    for(int i = 0; i < n-1 ; i++){
        scanf("%lld%lld",&x,&y);
        a[x].push_back(y);
        a[y].push_back(x);        
    }    
    for(int i = 0 ;i < n ;i++){
        dp[i] = 1;
    }
    
    dfs(1);
    
    ll cnt = 0;
    for(int i = 1; i <= n ;i++){
        cnt += dp[i];
        cnt %= mod;
    }
    
    printf("%d",cnt);    
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Asumi/p/8947540.html