/*
这个题要用到树的性质,一般比较难的图论题会往这方面靠拢,这样用很容易出错,应该先写暴力,然后再去一点点想正解
*/
//暴力70分
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
using namespace std;
const int maxn = ;
int read(){
char ch=getchar();
int x=,f=;
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
struct edge{
int v;
int w;
int nxt;
}e[maxn*];
int vis[maxn],d[maxn],flag,n,fa[maxn],tmp,ans;
int head[maxn],cnt;
vector<int> acc;
void ins(int u,int v,int w){
cnt++;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].nxt = head[u];
head[u] = cnt;
}
void dfs(int u,int f){
for(int i = head[u];i;i = e[i].nxt){
if(e[i].v == f) continue;
fa[e[i].v] = u;
dfs(e[i].v,u);
}
}
void dfs2(int u){
acc.push_back(u);
for(int i = head[u];i;i = e[i].nxt){
if(e[i].v == fa[u]) continue;
dfs2(e[i].v);
}
}
void dfs3(int u,int d){
vis[u] = true;
for(int i = head[u];i;i = e[i].nxt){
if(vis[e[i].v]) continue;
dfs3(e[i].v,d+e[i].w);
}
tmp = max(tmp,d);
//cout<<tmp<<endl;
}
int get_ans(int t){
ans = ;
acc.clear();
dfs2(t);
//cout<<acc.size()<<endl;
for(int i = ;i < acc.size();i++){
tmp = ;
memset(vis,false,sizeof(vis));
vis[fa[t]] = true;
dfs3(acc[i],);
ans = min(tmp,ans);
}
return ans;
}
void baoli(){
for(int i = ;i <= n;i++){
cout<<get_ans(i)<<endl;
}
}
int main(){
freopen("tower.in","r",stdin);
freopen("tower.out","w",stdout);
n = read();
int u,v,l;
for(int i = ;i < n;i++){
u = read();
v = read();
l = read();
ins(u,v,l);
ins(v,u,l);
}
dfs(,);
baoli();
return ;
}
//正解
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std; #define N 100010 int h[N], parent[N][], dmax[N], droot[N], diameter[N], radius[N], end[N];
int n, tote, height; struct edge{
int t, l, n;
}e[N * ]; void adde(int u, int v, int l) {
e[++tote].t = v;
e[tote].l = l;
e[tote].n = h[u];
h[u] = tote;
return ;
} void dfs1(int u) {
for (int i = h[u]; i; i = e[i].n) {
int v = e[i].t;
if (v == parent[u][]) continue;
parent[v][] = u;
dfs1(v);
}
return ;
} void dfs2(int u) {
int dmax2 = ;
dmax[u] = diameter[u] = radius[u] = ;//分别代表以u为根的最长路径,直径,半径
end[u] = u;//最长路径的叶子节点
for (int i = h[u]; i; i = e[i].n) {
int v = e[i].t, l = e[i].l;
if (parent[u][] == v) continue;
droot[v] = droot[u] + l;//到路径的距离
dfs2(v);//递归子节点
if (diameter[v] > diameter[u]) {//注意这里,直径有可能不经过根节点,这样半径直接用子树的
diameter[u] = diameter[v];
radius[u] = radius[v];
}
if (dmax[v] + l >= dmax[u]) {//最长路径
dmax2 = dmax[u];
dmax[u] = dmax[v] + l;
end[u] = end[v];
}
else if (dmax[v] + l > dmax2)//次长路径
dmax2 = dmax[v] + l;
if (dmax[u] + dmax2 > diameter[u]) {//直径被更新,需要更新半径
diameter[u] = dmax[u] + dmax2;
int t = height, z = end[u];
while (t >= ) {
if (parent[z][t] != && (dmax2 + droot[parent[z][t]] - droot[u]) > (dmax[u] + dmax2) / ) z = parent[z][t];//寻找一个节点,他是直径中所有子节点中,到最长路径叶子节点的长度小于他到次长路径叶子节点的长度的节点中,到前者距离最长的一个
t--;
}
int l1 = dmax2 + droot[z] - droot[u];//上面提到的到次长叶节点的路径长度
int l2 = diameter[u] - (droot[parent[z][]] - droot[u]) - dmax2;//这个点的父亲到最长叶节点的路径长度
radius[u] = min(l1, l2);//两者比较,谁更优就选谁,也就是半径长度
}
}
return ;
} int main() {
freopen("tower.in", "r", stdin);
freopen("tower.out", "w", stdout); scanf("%d",&n);
for (int i = ; i < n; i++) {
int u, v, l;
scanf("%d%d%d", &u, &v, &l);
adde(u, v, l); adde(v, u, l);
}
dfs1();//倍增处理相关
for(int i = ; i <= ; i++){
bool flag = false;
for (int j = ; j <= n; j++) {
parent[j][i] = parent[parent[j][i - ]][i - ];//找祖先
if (parent[j][i] != ) flag = true;
}
if (!flag) {
height = i;//记录高度
break;
}
}
dfs2();
for (int i = ; i <= n; i++) printf("%d\n", radius[i]); fclose(stdin);
fclose(stdout);
return ;
}

湖南附中模拟day1 瞭望塔的更多相关文章

  1. 湖南附中模拟day1 收银员

    4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...

  2. 湖南附中模拟day1 金坷垃

    题意描述"没有金坷垃,怎么种庄稼?"花花家有一块田,所有庄稼排成了 N 行 M 列.初始时,每棵庄稼都有一个自己的高度hi;j.花花每次可以使用 1mol 的金克拉使一棵庄稼的高度 ...

  3. 【bzoj1038】瞭望塔

    [bzoj1038]瞭望塔 题意 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折 ...

  4. 1038: [ZJOI2008]瞭望塔

    半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...

  5. 1038: [ZJOI2008]瞭望塔 - BZOJ

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  6. 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔

    1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...

  7. bzoj1038: [ZJOI2008]瞭望塔

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  8. BZOJ 1038 瞭望塔

    Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...

  9. [ZJOI2008]瞭望塔

    题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ...

随机推荐

  1. J-link烧写brjtag工具

    J-Link用的山寨货,不知道山寨了几代的那种....用的STM32F103C8T6的小板也是山寨了好几代那种,才25块钱...好在能用,J-Link用segger公司的软件能识别,也能找到CPU,板 ...

  2. shell命令locate

    介绍 linux上做维护的时候经常会去查找某个文件路径 如果不需要特殊的查找匹配(比如时间 大小...) 格式化的输出(此处用find) 建议用locate命令 因为locate命令查找速度非常的快 ...

  3. python——复制目录结构小脚本

    引言 有个需要,需要把某个目录下的目录结构进行复制,不要文件,当目录结构很少的时候可以手工去建立,当目录结构复杂,目录层次很深,目录很多的时候,这个时候要是还是手动去建立的话,实在不是一种好的方法,弄 ...

  4. CentOS关闭火狐浏览器Flash过期提示

    关闭旧版插件屏蔽提示 打开 about:config?filter=extensions.blocklist.enabled 右键切换,关闭flash版本过旧被屏蔽的提示. 参考: http://ti ...

  5. HDU 4857 逃生(反向拓扑排序)

    传送门 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社 ...

  6. POJ 3617 Best Cow Line (贪心)

    Best Cow Line   Time Limit: 1000MS      Memory Limit: 65536K Total Submissions: 16104    Accepted: 4 ...

  7. django1.8 提示(1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dictionary takes precedence. You must put the values of the following settings into your defau

    原因是升级之后不推荐使用单独的 TEMPLATES_DIR这样的设置了,使用TEMPLATE = []这种就好了 详细见https://openedx.atlassian.net/browse/TNL ...

  8. Code笔记 之:注册页面验证码

    文章内容包括: 1.验证码制作 -- 中文|字母|数字|…… 2.图文验证码 -- 图片防盗链(PHP而非JS) 3.JS防止右键点击图片 4.input表单输入框不记录输入过的信息 5.CSS+di ...

  9. [NOIP2014] 解方程&加强版 (bzoj3751 & vijos1915)

    大概有$O(m)$,$O(n\sqrt{nm})$,$O(n\sqrt{m})$的3个算法,其中后2个可以过加强版.代码是算法3,注意bzoj的数据卡掉了小于20000的质数. #include< ...

  10. 【原】textarea 换行之间的转换

    在操纵表单的时候,如果你在textarea输入的内容是换行的,如果没有进行相应的装换,你输出的内容是不会跟着一起换行的.如果后台返回给你的数据是带有<br />换行符的, 那么在texta ...