思路:我们其实只需要枚举每条边,求得最小值就行了。

先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相关推荐

  1. HDU 4123 树状DP+RMQ

    /*************************************************************************************************** ...

  2. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...

  3. UVA10859 放置街灯 Placing Lampposts(树状DP)

    UVA10859 放置街灯 Placing Lampposts(树状DP) 这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异 ...

  4. poj 1655 Balancing Act 树状dp

    //poj1655树状dp //求一个数的重心 // dfs找到节点v的各个子树的节点数 // 取最大值设为num[v],而v节点以上的子树的节点数 // 为总数-num[v]-1(包括v节点本身)设 ...

  5. hdu 4991(树状数组优化dp)

    Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. 树状dp(这个人写得好多转来慢慢看)

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  7. HDU 4358 树状数组+思路

    http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...

  8. hdu 1166 树状数组解

    树状数组解决   (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...

  9. 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 ...

最新文章

  1. AFNetworking 源代码分析
  2. Android信使Messenger解析
  3. 2017 五月 UFED Series Releases 系列 6.2更新发布
  4. pyecharts第四节、漏斗图
  5. 第10章 例题 7-4 汉诺(Hanoi)塔问题
  6. 【MyBatis】MyBatis分页插件PageHelper的使用
  7. 5.25上午 外教专业课 听力
  8. Windows 下的 terminal pro 打开终端 总是在默认位置 怎么在当前文件中打开呢
  9. Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)...
  10. CSDN光合计划-纯干货福利-推荐几个算法、分布式、数据库全系列学习教程(企业实用技术类)
  11. 数据库报错SELECT list is not in GROUP BY clause and contains nonaggregated col
  12. idea怎么跳转到源代码_mooc-IDEA 项目/文件之间跳转--002
  13. 接收 go run main.go 后面的参数_厦门油泥水三相离心分离机功能和参数
  14. [微信小程序] js变量名称写活
  15. ElementUI:使用nav报错Invalid prop: custom validator check failed for prop “index“.
  16. oa系统在线试用,零成本开始研发协作免费试用
  17. Ubuntu 12.04 安装离线词典
  18. C语言入门习题系列一(含答案)
  19. IGRP原理及配置案例
  20. 批量打印二维码的软件---使用心得(领跑条码标签打印软件)

热门文章

  1. c#怎么读htm文件_c#怎么读写文件和获取文件的扩展名
  2. matlab中fliter函数,用C语言实现MATLAB中Filter()函数
  3. forward 方法详解 java_详解Java从后台重定向(redirect)到另一个项目的方法
  4. 011_Cascader级联选择器
  5. 050_学习的CSS属性
  6. JavaScript在发送ajax请求时,URL域名地址是使用绝对地址还是相对地址?什么是浏览器跨域访问操作,js如何实现?
  7. android web 打印,Android设备WebView打印Console Log
  8. 使用CoordinatorLayout打造一个炫酷的详情页
  9. matlab 多次求解偏微分方程 ode45
  10. wordpress mysql 安装_wordpress 搭建安装教程 1 安装数据库、SQLyog