zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ubuntu 1804 docker install
    windows shortcut
    gallary
    g++ play
    linux profile
    terminator
    tmux
    ubuntu18
    windows toolkit
    windows terminal CLI
  • 原文地址:https://www.cnblogs.com/Asumi/p/8947540.html
Copyright © 2011-2022 走看看