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; }