湖南附中模拟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), ...
随机推荐
- python序列化模块json和pickle
序列化相关 1. json 应用场景: json模块主要用于处理json格式的数据,可以将json格式的数据转化为python的字典,便于python处理,同时也可以将python的字典或列表等对象转 ...
- ofo走出校园观察:市场定位导致产品错位?
Ofo和摩拜单车虽然同样都是做单车共享,但实际上两者在最初的市场定位是有明显的差异的,因此提供的产品方案也存在巨大的差异. 市场定位不同,导致产品方案的巨大差异 摩拜单车一开始就定位于开放市场,充分的 ...
- Theano tutorial – basic type
博客摘自:Deep learning 第二篇 婴儿学步 Theano如何做算数? import theano.tensor as T from theano import function x=T.d ...
- BZOJ1088: [SCOI2005]扫雷Mine
这道题A的好莫名其妙啊2333 传送门 状压DP,枚举上一个雷的分布情况(1<<3)-1,然后和当前的分布相结合,推出下一状态. //BZOJ 1088 //by Cydiater //2 ...
- jQuery 基础(3) -- jQuery 事件
jQuery 是为事件处理特别设计的.什么是事件?页面对不同访问者的响应叫做事件.事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.实例:在元素上移动鼠标.选取单选按钮点击元素在事件中经常 ...
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- win7搭建web服务器
首先找到安装的tomcat软件,打开里面的webapp文件夹,在里面新建一个文件夹用作web应用程序访问端地址,然后再到新建的文件夹test里放入想要被访问的东西,这里我用的是一个测试的页面test. ...
- Spring事务传播简介
一.事务传播属性(propagation) 1.REQUIRED,默认属性 此级别下,会为每一个调用的方法创建一个逻辑事务域,如果前面的方法已经创建了事务,那么后面的方法支持当前事务,如果当前没有事务 ...
- ubuntu sublime text3 lisence
help --> enter lisence ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813 ...
- 解惑好文:移动端H5页面高清多屏适配方案 (转)
转自:http://mobile.51cto.com/web-484304.htm https://github.com/amfe/lib-flexible/blob/master/src/makeg ...