hdu 3534 (树形DP)
2013-10-30 21:53
323 查看
题意:求出树的最长边和个数。
思路:最长边以前做过,用树形DP可以。求最长边的时候可以统计一下最长边的个数,那么以u为根节点的子树中最长边为:Len[u]+max(len[v]),个数node[u]*node[v]。
思路:最长边以前做过,用树形DP可以。求最长边的时候可以统计一下最长边的个数,那么以u为根节点的子树中最长边为:Len[u]+max(len[v]),个数node[u]*node[v]。
#include<stdio.h> #include<string.h> const int N=500000; const int inf=0x3fffffff; int head ,num,Len ,ans,node ,k; struct edge { int ed,w,next; }e[N*2]; void addedge(int x,int y,int w) { e[num].ed=y;e[num].w=w;e[num].next=head[x];head[x]=num++; e[num].ed=x;e[num].w=w;e[num].next=head[y];head[y]=num++; } void dfs(int u,int fa) { int i,v,temp; Len[u]=0;//最长边 node[u]=1;//最长边的个数 for(i=head[u];i!=-1;i=e[i].next) { v=e[i].ed; if(v==fa)continue; dfs(v,u); temp=Len[v]+e[i].w; if(temp+Len[u]>ans)//最长边经过v { k=node[v]*node[u]; ans=temp+Len[u]; } else if(temp+Len[u]==ans) k+=node[v]*node[u]; if(Len[u]<temp)//更新最长边 { Len[u]=temp; node[u]=node[v]; } else if(Len[u]==temp)//更新最长边的个数 node[u]+=node[v]; } } int main() { int n,i,x,y,w; while(scanf("%d",&n)!=-1) { memset(head,-1,sizeof(head)); num=0; for(i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&w); addedge(x,y,w); } ans=-inf;k=0; dfs(1,0); printf("%d %d\n",ans,k); } return 0; }
相关文章推荐
- :视频播放器与Handler 完美调用
- 各种居中
- 编译schroedinger-1.0.11
- 或许咱们可以打造一个信息共享平台
- 找工作总结-机会往往留给有准备的人
- A* 搜索算法
- 通用hash表
- android表示单位长度的三种方式
- nyoj 19 擅长排列的小明
- redis数据类型之zset(Sorted-Sets)
- 挖掘新的学习方法-专题式
- adb server is out of date. killing...
- 研究下linux下仿qq--eva0.4.1的源码1
- java 关于中文字的输出 输入 和文件操作(对象序列化)
- 解读AbsSeekBar【二】(注释中……)
- ROS的学习(十六)用C++写一个简单的服务器(service)和客户端(client)
- HDU4472_Count
- MySql5.5忘记root密码的解决方法
- Start GitHub
- Centos 6.2 开启 VNC远程桌面