【luogu3174】 [HAOI2009]毛毛虫 [动态规划 树形dp]
作者:互联网
求一条链链上的节点和与链上节点相连的兄弟和最大
在链上每个节点都被多算了一次 所以初设为1 虽然还没有搞清为什么要像树的直径一样跑两遍...
#include<bits/stdc++.h> using namespace std; #define Max(x,y) (x)<(y)?(y):(x) #define Min(x,y) (x)<(y)?(x):(y) #define ll long long #define rg register const int N=300000+5,M=1000000+5,inf=0x3f3f3f3f,P=9999973; int n,m,out[N],mxl=0,sf,ans=0; template <class t>void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x; } int head[N],tot=0; struct edge{int v,nxt;}e[N<<1]; void add(int u,int v){ e[++tot]=(edge){v,head[u]},head[u]=tot; } void dfs(int u,int fa,int dis){ if(dis>=mxl) mxl=dis,sf=u; ans=Max(ans,dis); for(int i=head[u];i;i=e[i].nxt) if(fa!=e[i].v) dfs(e[i].v,u,dis+out[u]); } int main(){ freopen("in.txt","r",stdin); rd(n),rd(m); memset(out,-1,sizeof(out)); for(int i=1,u,v;i<=m;++i) rd(u),rd(v),add(u,v),add(v,u),++out[u],++out[v]; dfs(1,0,0);mxl=-1,ans=0; dfs(sf,0,0); printf("%d",ans+2); return 0; }
标签:ch,int,rd,dp,dis,luogu3174,节点,HAOI2009,out 来源: https://www.cnblogs.com/lxyyyy/p/11210299.html