[HAOI2009]毛毛虫 dfs

来源:互联网 发布:淘宝千人千面原理 编辑:程序博客网 时间:2024/06/02 23:09

很多题都是这个套路,第一遍树形dp,第二遍邻位容斥转移

注意讨论清楚转移方式

码:

#include<iostream>#include<cstdio>#include<vector>using namespace std;#define N 400005vector<int>v[N];int f1[N],f2[N],a,b,ans,n,m,i;void dfs(int o,int fa){int i;f1[o]=1;f2[o]=1;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fa)continue;dfs(nd,o);if(f1[nd]>f1[o]){f2[o]=f1[o];f1[o]=f1[nd];}else{if(f1[nd]>f2[o])f2[o]=f1[nd];if(f2[nd]>f2[o])f2[o]=f2[nd];}}f1[o]+=v[o].size()-1;f2[o]+=v[o].size()-1;}void dfs2(int o,int fa){int i;if(o==1)ans=max(ans,int(f1[o]-(v[o].size()-1)+f2[o]-(v[o].size()-1)+v[o].size()-1));else ans=max(ans,int((f1[fa]-v[fa].size()+1==f1[o]?f2[fa]:f1[fa])+f1[o]));for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fa)continue;dfs2(nd,o);}}int main(){scanf("%d%d",&n,&m);for(i=1;i<=m;i++){scanf("%d%d",&a,&b);v[a].push_back(b);v[b].push_back(a);}dfs(1,0);dfs2(1,0);printf("%d",ans);}


原创粉丝点击