/*
题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小。
树的直径(Diameter)是指树上的最长简单路。
直径的求法:两遍BFS (or DFS)
若删除的边不是直径上的那么花费为max_len*wi
若删除的边是直径上的那么花费为max(dp[u][2],dp[v][2])*wi
*/
#pragma comment(linker, "/STACK:16777216")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; const int maxn=;
int dep[maxn],ans[maxn],father[maxn],max_len;//ans下标对应边的编号
int dp[maxn][];//j=0存i节点的到子树中的最长路,j=1存次长路,j=2存直径
bool vis[maxn];//标记是否为直径上的点
inline int max(int a,int b){return a>b?a:b;}
struct node
{
int id,w,v;
node(int id=,int w=,int v=):id(id),w(w),v(v){}
};
vector<node> f[maxn]; void dfs_dep(int u,int pre)//找最长路
{
for(int i=;i<f[u].size();i++)
{
int v=f[u][i].v;
if(v==pre) continue;
dep[v]=dep[u]+;
father[v]=u;
dfs_dep(v,u);
}
return ;
} void dfs(int u,int pre)
{
dp[u][]=dp[u][]=dp[u][]=;
for(int i=;i<f[u].size();i++)
{
int v=f[u][i].v;
if(v==pre) continue;
dfs(v,u);
int temp=dp[v][]+;
if(temp>dp[u][])
{
dp[u][]=dp[u][];dp[u][]=temp;
}
else if(temp>dp[u][])
dp[u][]=temp;
dp[u][]=max(dp[u][],dp[v][]);//u在子树直径边上与不再直径边上
}
dp[u][]=max(dp[u][],dp[u][]+dp[u][]);//u在子树直径中与不再直径中
} void solve(int u,int pre)
{
for(int i=;i<f[u].size();i++)
{
int v=f[u][i].v,id=f[u][i].id,w=f[u][i].w;
if(v==pre) continue;
solve(v,u);
//在树的直径上
if(vis[u] && vis[v])
ans[id]=max(ans[id],w*dp[v][]);
else ans[id]=w*max_len;
}
} int main()
{
int t,i,n,icase=,a,b,w;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=;i<=n;i++) f[i].clear();
for(i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&w);
f[a].push_back(node(i,w,b));
f[b].push_back(node(i,w,a));
}
int st,ed=,temp;
dfs_dep(ed,-);
for(i=;i<=n;i++)
if(dep[ed]<dep[i]) ed=i;
dep[st=ed]=;
dfs_dep(st,-);
ed=st;
for(i=;i<=n;i++)
if(dep[ed]<dep[i]) ed=i;
max_len=dep[ed];
memset(vis,,sizeof(vis));
father[st]=-;temp=ed;
while(father[temp]!=-)
vis[temp]=true,temp=father[temp];
memset(ans,,sizeof(ans));
dfs(st,-);solve(st,-);
dfs(ed,-);solve(ed,-);
temp=;
for(i=;i<n;i++)
if(ans[i]<ans[temp]) temp=i;
printf("Case #%d: %d\n",++icase,temp);
}
return ;
}

hdu 4679 树的直径的更多相关文章

  1. hdu 3721 树的直径

    思路:枚举+树的直径 #include<iostream> #include<cstring> #include<cstdio> #include<algor ...

  2. hdu 4514(树的直径+并查集)

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  3. Warm up HDU - 4612 树的直径

    题意:给出n个点和m条边的无向图,存在重边,问加一条边以后,剩下的桥的数量最少为多少. 题解: 你把这个无向图缩点后会得到一个只由桥来连接的图(可以说这个图中的所有边都是桥,相当于一棵树),然后我们只 ...

  4. hdu 4607 树的直径

    思路:利用dfs遍历整棵树,找出最长子树与次长子树,两者的和最大就是直径. 若k值小于直径就输出k-1,否则输出(k-d-1)*2+d; #include<iostream> #inclu ...

  5. Warm up HDU - 4612( 树的直径 边双连通分量)

    求在图中新建一条边后  剩下的最少的桥的数量..先tarjan求桥的数量..然后缩点..以连通分量为点建图  bfs求直径 最后用桥的数量减去直径即为答案 bfs求直径 https://www.cnb ...

  6. hdu 4679 树状dp

    思路:我们其实只需要枚举每条边,求得最小值就行了. 先dfs算出每个节点作为根时,其子树的最长路径,以及进过该节点的最长,次长,第三长路径. 然后在次dfs枚举求出切断某条边,求出这条边的两个端点为子 ...

  7. hdu 4679 Terrorist’s destroy 树的直径+dp

    题意:给你一棵树,每条边都有值W,然后问你去掉一条边,令val = w*max(两颗新树的直径),求val最小值~ 做法,先求树的直径,然后算出直径上每个点的最长枝条长度.这样对于每一条边,假如是枝条 ...

  8. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

  9. 【HDU 4612 Warm up】BCC 树的直径

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 题意:一个包含n个节点m条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...

随机推荐

  1. Hive的数据库和表

    本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的.基础的. Hive的数据库和表 先看一张草图: Hive结构 从图上可以 ...

  2. pytorch中torch.nn构建神经网络的不同层的含义

    主要是参考这里,写的很好PyTorch 入门实战(四)--利用Torch.nn构建卷积神经网络 卷积层nn.Con2d() 常用参数 in_channels:输入通道数 out_channels:输出 ...

  3. 各种Nand的总结

    1. 微观 NAND闪存NAND是非易失性存储技术,NAND闪存由多个存放以位(bit)为单位的单元构成,这些位通过电荷被打开或关闭,如何组织这些开关单元来储存在SSD上的数据,也决定了NAND闪存的 ...

  4. SPOJ1026 概率DP

    Favorite Dice BuggyD loves to carry his favorite die around. Perhaps you wonder why it's his favorit ...

  5. python requests第三方库详解

    异常处理:try ... except ...

  6. 9.2python操作redis

    Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...

  7. Myeclipse代码格式化的样式和保存自动格式化

    第一种方法:下载格式化代码样式文件,参考这位老兄的方法(包含了保存自动格式化):http://blog.csdn.net/u010028869/article/details/49780515   下 ...

  8. spring整合redis缓存,以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    maven项目中在pom.xml中依赖2个jar包,其他的spring的jar包省略: <dependency> <groupId>redis.clients</grou ...

  9. Django基本使用

    目录 1 安装 1.1 安装pip 1.2 安装django 2 创建项目 2.1 使用 管理工具 django-admin.py 来创建 PyLearn 项目: 2.2 启动服务 本文章以下所有列子 ...

  10. SDWebImage实现原理(怎么实现图片缓存器)

    入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处 ...