思路:枚举+树的直径

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define clr(x,y) memset(x,y,sizeof(x))
#define Maxn 3000
#define inf 100000000
using namespace std;
int head[Maxn],Max[Maxn],lMax[Maxn],id[Maxn],road[Maxn],e,n,ans,te;
bool vi[Maxn];
struct Edge{
int u,v,next,val;
}edge[Maxn*];
void init()
{
clr(head,-);
clr(vi,);
clr(Max,);
clr(lMax,);
clr(road,);
clr(id,);
e=;
}
void add(int u,int v,int val)
{
edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
edge[e].u=v,edge[e].v=u,edge[e].val=val,edge[e].next=head[v],head[v]=e++;
}
void dfs(int u,int col,int fa)
{
int v,i;
id[u]=col;
for(i=head[u];i!=-;i=edge[i].next){
v=edge[i].v;
if(v==fa) continue;
dfs(v,col,u);
if(Max[v]+edge[i].val>Max[u]){
lMax[u]=Max[u];
Max[u]=Max[v]+edge[i].val;
road[u]=v;
} else if(Max[v]+edge[i].val>lMax[u])
lMax[u]=Max[v]+edge[i].val;
}
te=max(te,lMax[u]+Max[u]);
}
void predfs(int u,int d,int fa)
{
int v,i;
Max[u]=max(Max[u],d);
for(i=head[u];i!=-;i=edge[i].next){
v=edge[i].v;
if(v==fa) continue;
if(road[u]==v) predfs(v,max(lMax[u],d)+edge[i].val,u);
else predfs(v,max(Max[u],d)+edge[i].val,u);
}
}
void solve()
{
int i,j,u,v,val,a,b;
ans=inf;
for(i=;i<e-;i+=){
u=edge[i].u,v=edge[i].v,val=edge[i].val;
clr(Max,);
clr(lMax,);
a=b=inf;
te=;
dfs(u,,v);
predfs(u,,v);
dfs(v,,u);
predfs(v,,u);
for(j=;j<=n;j++){
//cout<<j<<" "<<id[j]<<" "<<Max[j]<<endl;
if(id[j]) a=min(a,Max[j]);
else b=min(b,Max[j]);
}
ans=min(ans,max(a+b+val,te));
//cout<<a<<" "<<b<<" "<<val<<endl;
// cout<<"******************"<<endl;
}
return ;
}
int main()
{
int i,j,u,v,val,t,Ca=;
scanf("%d",&t);
while(t--){
init();
scanf("%d",&n);
for(i=;i<n;i++){
scanf("%d%d%d",&u,&v,&val);
u++,v++;
add(u,v,val);
}
solve();
printf("Case %d: %d\n",++Ca,ans);
}
return ;
}

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

  1. hdu 3721 树的最小直径

    题意:       给你一棵树,让你改变一条边,改变之后依然是一棵树,然后问你怎样改变才能让树的直径最短.这里的改变一条边指的是指把一条边长度不变,连在别的两个点上. 思路:       首先求出树的 ...

  2. hdu 4679 树的直径

    /* 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍BFS (or DFS) 若删除的边不是 ...

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

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

  4. Warm up HDU - 4612 树的直径

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

  5. hdu 4607 树的直径

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

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

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

  7. hdu 4607 Park Visit 求树的直径

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

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

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

  9. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. python基础一 day16 匿名函数

    def add(x,y): return x+y add = lambda x,y:x+yprint(add(1,2)) dic={'k1':10,'k2':100,'k3':30}def func( ...

  2. java基础面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

    package com.swift; public class Switch_Test { public static void main(String[] args) { /* * switch语句 ...

  3. Java第六次作业:RuPengGame setGameSize setGameTitle alert loadBgView playSound pause closeSound confirm input createText setTextPosition setTextColor setTextFontSize hideText showText CreateImage(number)

    package com.swift; import java.awt.Color; import com.rupeng.game.GameCore;//导入游戏引擎包 //实现Runnable接口 p ...

  4. 牛客NOIP提高组R1 C保护(主席树)

    题意 题目链接 Sol Orz lyq 我们可以把一支军队(u, v)拆分为两个(u, lca)和(v, lca) 考虑一个点x,什么时候军队对它有贡献,肯定是u或v在他的子树内,且lca在他的子树外 ...

  5. 水平垂直居中图片及文字(兼容IE6+)实例

    直接看代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...

  6. 绘制圆形 和 椭圆形:边圆形 imageellipse() 、 填充圆形imagefilledellipse()

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  7. 牛客第四次多校Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 题目描述 The mode of an integer sequence is the valu ...

  8. 如何在C#中调试LINQ查询

    原文:How to Debug LINQ queries in C# 作者:Michael Shpilt 译文:如何在C#中调试LINQ查询 译者:Lamond Lu 在C#中我最喜欢的特性就是LIN ...

  9. 自定义RadioGrop,支持添加包裹着的RadioButton

    控件类: package com.chinaCEB.cebView; import android.annotation.TargetApi; import android.content.Conte ...

  10. 决策树python实现小样例

    我们经常使用决策树处理分类问题,近年来的调查表明决策树也是经常使用的数据挖掘算法K-NN可以完成多分类任务,但是它最大的缺点是无法给出数据的内在含义,决策树的主要优势在于数据形式非常容易理解决策树的优 ...