拜访奶牛

一开始和别的题一起做,想错了,然后就觉得是树上最大独立集,咦,不对啊,一个点儿子可以选多个,然后就黑白染色,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 }

猜你喜欢

转载自www.cnblogs.com/lcan/p/9614746.html