一开始和别的题一起做,想错了,然后就觉得是树上最大独立集,咦,不对啊,一个点儿子可以选多个,然后就黑白染色,30’,哦,可以跨两个再选
然后看题解,就是树上DP的方法,加起来就是了,一开始不在状态,我原谅自己了,接下来的140min不能再这样了
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int maxn=5e5+7; 5 int num,n; 6 int head[maxn],f[maxn][3]; 7 struct Edge{ 8 int next,to; 9 }edge[maxn*2]; 10 void add(int from,int to){ 11 edge[++num].next=head[from]; 12 edge[num].to=to; 13 head[from]=num; 14 } 15 void dfs(int x,int pre){ 16 f[x][1]=1; 17 if(edge[head[x]].to==pre&&edge[head[x]].next==0) return; 18 for(int i=head[x];i;i=edge[i].next){ 19 int v=edge[i].to;if(v==pre) continue; 20 dfs(v,x); 21 f[x][0]+=max(f[v][1],f[v][0]); 22 f[x][1]+=f[v][0]; 23 } 24 } 25 int main(){ 26 cin>>n; 27 for(int i=1;i<n;i++){ 28 int u,v;cin>>u>>v; 29 add(u,v);add(v,u); 30 } 31 dfs(1,0); 32 cout<<max(f[1][1],f[1][0])<<endl; 33 return 0; 34 }