hdu 3721 树的直径
思路:枚举+树的直径
#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 树的直径的更多相关文章
- hdu 3721 树的最小直径
题意: 给你一棵树,让你改变一条边,改变之后依然是一棵树,然后问你怎样改变才能让树的直径最短.这里的改变一条边指的是指把一条边长度不变,连在别的两个点上. 思路: 首先求出树的 ...
- hdu 4679 树的直径
/* 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍BFS (or DFS) 若删除的边不是 ...
- hdu 4514(树的直径+并查集)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- Warm up HDU - 4612 树的直径
题意:给出n个点和m条边的无向图,存在重边,问加一条边以后,剩下的桥的数量最少为多少. 题解: 你把这个无向图缩点后会得到一个只由桥来连接的图(可以说这个图中的所有边都是桥,相当于一棵树),然后我们只 ...
- hdu 4607 树的直径
思路:利用dfs遍历整棵树,找出最长子树与次长子树,两者的和最大就是直径. 若k值小于直径就输出k-1,否则输出(k-d-1)*2+d; #include<iostream> #inclu ...
- Warm up HDU - 4612( 树的直径 边双连通分量)
求在图中新建一条边后 剩下的最少的桥的数量..先tarjan求桥的数量..然后缩点..以连通分量为点建图 bfs求直径 最后用桥的数量减去直径即为答案 bfs求直径 https://www.cnb ...
- hdu 4607 Park Visit 求树的直径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...
- 【HDU 4612 Warm up】BCC 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 题意:一个包含n个节点m条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...
- HDU 2196.Computer 树形dp 树的直径
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
随机推荐
- 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( ...
- java基础面试题:switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
package com.swift; public class Switch_Test { public static void main(String[] args) { /* * switch语句 ...
- 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 ...
- 牛客NOIP提高组R1 C保护(主席树)
题意 题目链接 Sol Orz lyq 我们可以把一支军队(u, v)拆分为两个(u, lca)和(v, lca) 考虑一个点x,什么时候军队对它有贡献,肯定是u或v在他的子树内,且lca在他的子树外 ...
- 水平垂直居中图片及文字(兼容IE6+)实例
直接看代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...
- 绘制圆形 和 椭圆形:边圆形 imageellipse() 、 填充圆形imagefilledellipse()
<?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...
- 牛客第四次多校Maximum Mode
链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 题目描述 The mode of an integer sequence is the valu ...
- 如何在C#中调试LINQ查询
原文:How to Debug LINQ queries in C# 作者:Michael Shpilt 译文:如何在C#中调试LINQ查询 译者:Lamond Lu 在C#中我最喜欢的特性就是LIN ...
- 自定义RadioGrop,支持添加包裹着的RadioButton
控件类: package com.chinaCEB.cebView; import android.annotation.TargetApi; import android.content.Conte ...
- 决策树python实现小样例
我们经常使用决策树处理分类问题,近年来的调查表明决策树也是经常使用的数据挖掘算法K-NN可以完成多分类任务,但是它最大的缺点是无法给出数据的内在含义,决策树的主要优势在于数据形式非常容易理解决策树的优 ...