hdu 4679 树状dp
思路:我们其实只需要枚举每条边,求得最小值就行了。
先dfs算出每个节点作为根时,其子树的最长路径,以及进过该节点的最长,次长,第三长路径。
然后在次dfs枚举求出切断某条边,求出这条边的两个端点为子树根,其子树的最长路径。b就是其中较大的。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<vector> #define Maxn 200010 using namespace std; int road[Maxn],Max[Maxn],lMax[Maxn],vi[Maxn],e,head[Maxn],dis[Maxn],ldis[Maxn],pr,ans,sMax[Maxn],lroad[Maxn]; struct Edge{int u,v,val,id,next; }edge[Maxn*4]; void init() {memset(road,0,sizeof(road));memset(Max,0,sizeof(Max));memset(lMax,0,sizeof(lMax));memset(vi,0,sizeof(vi));memset(dis,0,sizeof(dis));memset(ldis,0,sizeof(ldis));memset(head,-1,sizeof(head));memset(sMax,0,sizeof(sMax));memset(lroad,0,sizeof(lroad));e=0; } void add(int u,int v,int val,int id) {edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].id=id,edge[e].next=head[u],head[u]=e++;edge[e].u=v,edge[e].v=u,edge[e].val=val,edge[e].id=id,edge[e].next=head[v],head[v]=e++; } void dfs(int u) {int i,v;vi[u]=1;for(i=head[u];i!=-1;i=edge[i].next){v=edge[i].v;if(vi[v]) continue;dfs(v);if(Max[v]+1>Max[u]){sMax[u]=lMax[u];lroad[u]=road[u];lMax[u]=Max[u];Max[u]=Max[v]+1;road[u]=v;}elseif(Max[v]+1>lMax[u]){sMax[u]=lMax[u];lMax[u]=Max[v]+1;lroad[u]=v;}dis[u]=max(dis[u],Max[u]+lMax[u]);dis[u]=max(dis[u],dis[v]);} } void predfs(int u,int d,int pre,int fa) {int i,v;vi[u]=1;int now=0;int a,b=0;for(i=head[u];i!=-1;i=edge[i].next){v=edge[i].v;if(vi[v]) continue;a=edge[i].val;now=pre;if(road[u]==v){now=max(d+lMax[u],now);now=max(lMax[u]+sMax[u],now);b=max(now,dis[v]);if(a*b<=pr){if(a*b==pr){if(edge[i].id<ans)ans=edge[i].id;}elsepr=a*b,ans=edge[i].id;}predfs(v,max(d,lMax[u])+1,now,u);}elseif(lroad[u]==v){now=max(d+Max[u],now);now=max(Max[u]+sMax[u],now);b=max(now,dis[v]);if(a*b<=pr){if(a*b==pr){if(edge[i].id<ans)ans=edge[i].id;}elsepr=a*b,ans=edge[i].id;}predfs(v,max(d,Max[u])+1,now,u);}else{now=max(d+Max[u],now);now=max(Max[u]+lMax[u],now);b=max(now,dis[v]);if(a*b<=pr){if(a*b==pr){if(edge[i].id<ans)ans=edge[i].id;}elsepr=a*b,ans=edge[i].id;}predfs(v,max(d,Max[u])+1,now,u);}} } int main() {int n,i,j,m,t,u,v,w,Case=0;scanf("%d",&t);while(t--){init();scanf("%d",&n);for(i=1;i<=n-1;i++){scanf("%d%d%d",&u,&v,&w);add(u,v,w,i);}int a,b;dfs(1);memset(vi,0,sizeof(vi));pr=2000000000;ans=10000000;predfs(1,0,0,0);printf("Case #%d: %d\n",++Case,ans);}return 0; }
转载于:https://www.cnblogs.com/wangfang20/p/3262308.html
hdu 4679 树状dp相关推荐
- HDU 4123 树状DP+RMQ
/*************************************************************************************************** ...
- hdu 1561 The more, The Better_树状dp
题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...
- UVA10859 放置街灯 Placing Lampposts(树状DP)
UVA10859 放置街灯 Placing Lampposts(树状DP) 这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异 ...
- poj 1655 Balancing Act 树状dp
//poj1655树状dp //求一个数的重心 // dfs找到节点v的各个子树的节点数 // 取最大值设为num[v],而v节点以上的子树的节点数 // 为总数-num[v]-1(包括v节点本身)设 ...
- hdu 4991(树状数组优化dp)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 树状dp(这个人写得好多转来慢慢看)
树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...
- HDU 4358 树状数组+思路
http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...
- hdu 1166 树状数组解
树状数组解决 (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...
- UVA 1220 Party at Hali-Bula (树状DP+记忆化搜索)
Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from ...
最新文章
- AFNetworking 源代码分析
- Android信使Messenger解析
- 2017 五月 UFED Series Releases 系列 6.2更新发布
- pyecharts第四节、漏斗图
- 第10章 例题 7-4 汉诺(Hanoi)塔问题
- 【MyBatis】MyBatis分页插件PageHelper的使用
- 5.25上午 外教专业课 听力
- Windows 下的 terminal pro 打开终端 总是在默认位置 怎么在当前文件中打开呢
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...
- CSDN光合计划-纯干货福利-推荐几个算法、分布式、数据库全系列学习教程(企业实用技术类)
- 数据库报错SELECT list is not in GROUP BY clause and contains nonaggregated col
- idea怎么跳转到源代码_mooc-IDEA 项目/文件之间跳转--002
- 接收 go run main.go 后面的参数_厦门油泥水三相离心分离机功能和参数
- [微信小程序] js变量名称写活
- ElementUI:使用nav报错Invalid prop: custom validator check failed for prop “index“.
- oa系统在线试用,零成本开始研发协作免费试用
- Ubuntu 12.04 安装离线词典
- C语言入门习题系列一(含答案)
- IGRP原理及配置案例
- 批量打印二维码的软件---使用心得(领跑条码标签打印软件)
热门文章
- c#怎么读htm文件_c#怎么读写文件和获取文件的扩展名
- matlab中fliter函数,用C语言实现MATLAB中Filter()函数
- forward 方法详解 java_详解Java从后台重定向(redirect)到另一个项目的方法
- 011_Cascader级联选择器
- 050_学习的CSS属性
- JavaScript在发送ajax请求时,URL域名地址是使用绝对地址还是相对地址?什么是浏览器跨域访问操作,js如何实现?
- android web 打印,Android设备WebView打印Console Log
- 使用CoordinatorLayout打造一个炫酷的详情页
- matlab 多次求解偏微分方程 ode45
- wordpress mysql 安装_wordpress 搭建安装教程 1 安装数据库、SQLyog