湖南附中模拟day1 瞭望塔
/*
这个题要用到树的性质,一般比较难的图论题会往这方面靠拢,这样用很容易出错,应该先写暴力,然后再去一点点想正解
*/
//暴力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 瞭望塔的更多相关文章
- 湖南附中模拟day1 收银员
4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...
- 湖南附中模拟day1 金坷垃
题意描述"没有金坷垃,怎么种庄稼?"花花家有一块田,所有庄稼排成了 N 行 M 列.初始时,每棵庄稼都有一个自己的高度hi;j.花花每次可以使用 1mol 的金克拉使一棵庄稼的高度 ...
- 【bzoj1038】瞭望塔
[bzoj1038]瞭望塔 题意 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折 ...
- 1038: [ZJOI2008]瞭望塔
半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...
- 1038: [ZJOI2008]瞭望塔 - BZOJ
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- 【BZOJ 1038】 1038: [ZJOI2008]瞭望塔
1038: [ZJOI2008]瞭望塔 Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 ...
- bzoj1038: [ZJOI2008]瞭望塔
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- BZOJ 1038 瞭望塔
Description 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安.我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, ...
- [ZJOI2008]瞭望塔
题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ...
随机推荐
- Unity3d5.0 新UI之2048
因为汽车系统没写出来所以,纠结之中,弄了弄新版本的UI. 做了个2048. 新版本的unity的UI必须以Canvas为基底来呈现,如果没有加画布的话可是显示不出来东西的哦. 而且作为UI上的所有组件 ...
- A.Kaw矩阵代数初步学习笔记 1. Introduction
“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...
- POJ 2492 A Bug's Life
传送门:A Bug's Life Description Background Professor Hopper is researching the sexual behavior of a rar ...
- centos安装CODEBLOCKS
装了好多次系统,每次装的时候都有要在网上各种查,太麻烦了.所以决定记录一下,以后用到的时候会方便一些.当然,本文来源于网络,取百家之长,最重要的是本人已验证过,说明对本系统是可行的. 在CentOS7 ...
- 翻译:通往WinDbg的捷径(一)
原文:http://www.debuginfo.com/articles/easywindbg.html译者:arhat时间:2006年4月13日关键词:CDB WinDbg 导言你钟情什么样的调试器 ...
- JavaWeb---总结(三)Tomcat服务器学习和使用(一)
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- BZOJ4004: [JLOI2015]装备购买
总之就是线性基那一套贪心理论直接做就好了. 然而加强数据后很卡精度的样子. 于是重点在于这个特技:在整数模意义下搞. #include<cstdio> #include<algori ...
- FIREFOX A tool for easily making HTTP requests (GET/PUT/POST/DELETE)
https://addons.mozilla.org/zh-CN/firefox/addon/httprequester/
- jsp action中附件下载的写法
//一些主要的包和类 import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java ...
- 后台程序员的HTTP缓存
1.后端程序员只需要关注请求头: if-None-Match //上一次response头中的ETag的值. 响应头: Etag //是URL的Entity Tag,用于标示URL对象是否改变,区分不 ...