HDU 5886 Tower Defence
树的直径。
比赛的时候想着先树$dp$处理子树上的最长链和次长链,然后再从上到下进行一次$dfs$统计答案,和$CCPC$网络赛那个树$dp$一样,肯定是可以写的,但会很烦.......后来写崩了。
然后有一种新思路,很容易写。
假设下图中红线是树的直径,圆圈是直径上的节点,黑线表示一颗树。
如果删除的边不在直径上,那么删除这条边的答案就是直径长度。
如果删除的边在直径上,也就把下面的图分成了两半,左边和右边。
左边最大值会在什么情况下产生?
必然是$A->B->C$这样的情况产生的。不可能是从$D$到$C$这样的路径产生,因为$D->E$的长度最长只可能是$A->D$的长度。
右边部分最大值产生的情况也是一样的。
所以只要递推一下就可以了。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<bitset>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*+c-''; c=getchar();}
} const int maxn=;
int T,n,h[maxn],sz,mx,p1,p2,ll;
int path[maxn],tmp[maxn],cnt,ans[maxn];
struct Edge{int u,v,w,nx;}e[*maxn];
int M[maxn];
bool f[maxn],g[maxn];
int P[maxn],Q[maxn],li[maxn],num; void add(int a,int b,int c)
{
e[sz].u=a; e[sz].v=b; e[sz].w=c;
e[sz].nx=h[a]; h[a]=sz++;
} void dfs(int x,int dep,int len,bool d)
{
f[x]=;
if(len>mx)
{
if(d==) mx=len,p1=x;
else
{
mx=len,p2=x,cnt=dep;
for(int i=;i<cnt;i++) path[i]=tmp[i];
}
}
for(int i=h[x];i!=-;i=e[i].nx)
{
if(f[e[i].v]) continue;
tmp[dep]=i;
dfs(e[i].v,dep+,len+e[i].w,d);
}
} void Find(int x,int len)
{
g[x]=; if(len>ll) ll=len;
for(int i=h[x];i!=-;i=e[i].nx)
{
if(f[i/]) continue;
if(g[e[i].v]) continue;
Find(e[i].v,len+e[i].w);
}
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(h,-,sizeof h); cnt=sz=;
for(int i=; i<n-; i++)
{
int u,v,w; scanf("%d%d%d",&u,&v,&w);
add(u,v,w); add(v,u,w);
}
memset(f,mx=,sizeof f); dfs(,,,);
memset(f,mx=,sizeof f); dfs(p1,,,); // for(int i=0;i<cnt;i++) printf("%d -> %d\n",e[path[i]].u,e[path[i]].v); memset(f,,sizeof f);
for(int i=; i<cnt; i++) f[path[i]/]=; memset(g,,sizeof g); int L=,R; for(int i=;i<cnt;i++)
{
ll=; Find(e[path[i]].v,);
M[e[path[i]].v]=ll;
} L=; P[e[path[]].u]=;
for(int i=;i<cnt;i++)
{
L=L+e[path[i]].w;
P[e[path[i]].v]=max(L+M[e[path[i]].v],P[e[path[i]].u]);
} R=; Q[e[path[cnt-]].v]=;
for(int i=cnt-;i>=;i--)
{
R=R+e[path[i]].w;
Q[e[path[i]].u]=max(R+M[e[path[i]].u],Q[e[path[i]].v]);
} for(int i=;i<cnt;i++)
{
int x1=P[e[path[i]].u],x2=Q[e[path[i]].v];
ans[path[i]/]=max(x1,x2);
} for(int i=; i<n-; i++) if(f[i]==) ans[i]=mx; LL Ans=;
for(int i=;i<n-;i++) Ans=Ans+(LL)ans[i];
printf("%lld\n",Ans);
}
return ;
}
HDU 5886 Tower Defence的更多相关文章
- 动态规划(树形DP):HDU 5886 Tower Defence
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2MAAAERCAIAAAB5Jui9AAAgAElEQVR4nOy9a6wsS3YmFL/cEkh4LP
- HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)
题目链接 2016 Qingdao Online Problem I 题意 在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的 ...
- hdu 5779 Tower Defence
题意:考虑由$n$个结点构成的无向图,每条边的长度均为$1$,问有多少种构图方法使得结点$1$与任意其它节点之间的最短距离均不等于$k$(无法到达时距离等于无穷大),输出答案对$1e9+7$取模.$1 ...
- Hdu 2971 Tower
Description Alan loves to construct the towers of building bricks. His towers consist of many cuboid ...
- hdu 4779 Tower Defense (思维+组合数学)
Tower Defense Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- HDU5886 Tower Defence 【两遍树形dp】【最长链预处理】
题意:N个点的一棵带权树.切掉某条边的价值为切后两树直径中的最大值.求各个边切掉后的价值和(共N-1项). 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表 ...
- HDU5779 Tower Defence (BestCoder Round #85 D) 计数dp
分析(官方题解): 一点感想:(这个题是看题解并不是特别会转移,当然写完之后看起来题解说得很清晰,主要是人太弱 这个题是参考faebdc神的代码写的,说句题外话,很荣幸高中和faebdc巨一个省,虽然 ...
- hdu 4779 Tower Defense 2013杭州现场赛
/** 题意: 有两种塔,重塔,轻塔.每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击.在一个n*m 的矩阵中,最少放一个塔,可放多 ...
- HDU5779 Tower Defence
dp[i][j][k] 已选i个人 选到第j层 第j层有k个人 讨论相邻层 上一层选了l人 那么共有 两层之间的方案数 以及这一层自己的方案数 #include<bits/stdc++.h&g ...
随机推荐
- CSLA .NET是一个.NET软件开发框架
CSLA .NET是一个.NET软件开发框架,帮助开发者“为Windows.Web.面向服务和工作流等应用构建强大和可维护的业务逻辑层”. CSLA是Component-based, Scalable ...
- [原]逆向iOS SDK -- “添加本地通知”的流程分析
观点: 代码面前没有秘密 添加通知的 Demo 代码 - (void)scheduleOneLocalNotification { [[UIApplication sharedApplication] ...
- 企业架构研究总结(28)——TOGAF架构开发方法(ADM)之需求管理阶段
1.11 需求管理(Requirements Management) 企业架构开发方法各阶段——需求管理 1.11.1 目标 本阶段的目标是定义一个过程,使企业架构的需求可以被识别.存储并与其他架构开 ...
- Slide-out Sidebar Menu
IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu) 2013-09-03 22:13 by lixingle, 270 阅读, 0 评论, 收藏, 编辑 最近滑动菜单比较流 ...
- Modern 阅读笔记 一 PSR标准
一.标准 PSR php standards Recommendation PHP 推荐标准 PSR-1 基本代码风格 PSR-2 严格的代码风格 PSR-3 日志记录器接口 PSR-4 自动加载 ...
- About Spring
“Spring is the most popular application development framework for enterprise Java.”这是Spring官方首页上的第一句 ...
- elasticsearch data importing
ElasticSearch stores each piece of data in a document. That's what I need. Using the bulk API. Trans ...
- Arduino 3G shield using SoftwareSerial to control
On the 3G shield, by default the power pin is on D8 and reset pin is on D9. Make it HIGH then it wor ...
- Operation not permitted引发的惊魂72小时
0.问题及描述 在测试产品的时候,莫名其妙发现了我们的主进程VPNd会出现以下的报错: 2013-07-18 13:05:13 www.1.com/192.168.200.220:65527 wri ...
- 30+WordPress古典风格的主题-古典却不失时尚
通过WordPress古典风格主题,你可以快速的让你的网站呈现古典情调,并在竞争中脱颖而出.古典风格的网页设计是非常受欢迎的,现在,你可能想知道为什么.很多人被古典风格吸引,他们将一些陈旧的,过时的, ...