前言:好久没有写树上dp了,这儿题目还是挺有意思的
题目地址
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
//#define int long long
int n;
const int N = (int)1e5+10;
int e[N],ne[N],h[N],idx = 0;
int dp[2][N];
void add(int a,int b){
e[++idx] = b; ne[idx] = h[a]; h[a] = idx;
}
void dfs(int node,int fa){
dp[1][node] = 1 , dp[0][node] = 0;
for(int i=h[node];i;i=ne[i]){
int to = e[i];
if(to==fa) continue;
dfs(to,node);
dp[0][node] += dp[1][to];
dp[1][node] += min(dp[0][to],dp[1][to]);
}
}
signed main(){
cin >> n;
for(int i=0;i<n;i++){
int now,num; cin >> now >> num;
now++;
for(int j=1;j<=num;j++){
int u; cin >> u; u++;
add(now,u); add(u,now);
}
}
dfs(1,-1);
cout << min(dp[0][1],dp[1][1]);
system("pause");
return 0;
}
再来一个双倍经验的题目
题目地址