NOIP 2007 提高第四题。

啊......我还是看了题解才做出来的。

这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊!

然后,这破题怎么暴力?感觉我的spfa,dijkstra都WA2了...

最后还是跑去看了题解。

一步一步慢慢模拟就出来了。

首先,肯定要跑floyd的。

然后,我们居然还要个邻接表来存图......(用来dfs求直径)

无脑Floyd的同时,记录一条直径的起点,终点。

find_d求了一条直径上的所有点。

然后find_f求出了直径上每个点不超过s能去的最远点。

然后对于每段直径上小于s的路径,求出每个点的min的max作为偏心距,然后再求min。

然后输出,成功。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int chart[][],n,s,top,d;
struct Edge
{
int u,v,len,next;
}edge[];
int point_e[],d_f[][],topd;///0dian 1xiabiao
bool vis[];
void add(int x,int y,int z)
{
top++;
edge[top].u=x;
edge[top].v=y;
edge[top].len=z;
edge[top].next=point_e[x];
point_e[x]=top;
return;
}
///
bool find_d(int a,int b)
{
if(a==b)
{
d_f[++topd][]=b;
return ;
}
if(vis[a]) return ;
vis[a]=;
int i=point_e[a];
while(i)
{
if(find_d(edge[i].v,b))
{
d_f[++topd][]=a;
vis[a]=;
return ;
}
i=edge[i].next;
}
vis[a]=;
return ;
}
void find_f(int k)
{
int i=k;
for(;i<=topd;i++)
{
if(chart[d_f[k][]][d_f[i][]]>s) break;
}
i--;
d_f[k][]=i;
return;
}
int find_ans(int k)
{
int ans=,now=;
for(int i=;i<=n;i++)
{
now=;
for(int j=k;j<=d_f[k][];j++)
{
now=min(now,chart[i][d_f[j][]]);
}
ans=max(ans,now);
}
return ans;
}
int main()
{
memset(chart,0x3f,sizeof(chart));
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++) chart[i][i]=;
int x,y,z;
for(int i=;i<n;i++)
{
scanf ("%d%d%d",&x,&y,&z);
chart[x][y]=chart[y][x]=z;
add(x,y,z);
add(y,x,z);
}
int da,db;
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(chart[i][j]>chart[i][k]+chart[k][j])
{
chart[i][j]=chart[i][k]+chart[k][j];
if(chart[i][j]>d)
{
d=chart[i][j];
da=i;db=j;
}
}
}
}
}
///
/**
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",chart[i][j]);
}
printf("\n");
}
*/
///
find_d(da,db);
for(int i=;i<=topd;i++) find_f(i);
///
/**
for(int i=1;i<=topd;i++) printf("%d ",d_f[i][0]);
printf("\n");
for(int i=1;i<=topd;i++) printf("%d ",d_f[i][1]);
*/
///
int now,ans=;
for(int i=;i<=topd;i++)
{
now=find_ans(i);
//printf("find_ans(%d)=%d\n",i,now);
ans=min(ans,now);
}
printf("%d",ans);
return ;
}

AC代码在此

这个纯暴力模拟题居然是蓝题...说明了我的暴力功力还不够。以后还要练搜索剪枝的。先做点USACO吧。

(logeadd:133行代码怎么不能是蓝题了?好像有点道理啊...)

P1099 树网的核的更多相关文章

  1. 洛谷 P1099 树网的核

    P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...

  2. bzoj1999 / P1099 树网的核

    P1099 树网的核 (bzoj数据加强) 前置知识:树的直径 (并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE) 正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再 ...

  3. P1099 树网的核——模拟+树形结构

    P1099 树网的核 无根树,在直径上找到一条长度不超过s的路径,使得最远的点距离这条路径的距离最短: 首先两遍dfs找到直径(第二次找的时候一定要吧father[]清零) 在找到的直径下枚举长度不超 ...

  4. P2491 消防/P1099 树网的核

    P2491 消防/P1099 树网的核 双倍经验,双倍快乐. 题意 在一个树上选择一段总长度不超过\(s\)的链使所有点到该链距离的最大值最小. 输出这个最小的值. 做法 Define:以下\(s\) ...

  5. [NOIP2007] 提高组 洛谷P1099 树网的核

    题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...

  6. P1099 树网的核 && P2491 [SDOI2011]消防

    给定一棵树, 你可以在树的直径上确定一条长度不超过 \(S\) 的链, 使得树上离此链最长的点距离最小, 输出这个距离 P2491 数据范围为 P1099 的 \(1000\) 倍 Solution ...

  7. #P1099 树网的核 题解

    题目描述 pdf 题解 这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵. 已经给出来这是个DAG,所以不用担心连通性的问题.那么怎么做呢? 朴素的做法是把树的直径的两个端点都统计出来 ...

  8. 洛谷P1099 树网的核

    传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...

  9. 2018.11.06 洛谷P1099 树网的核(最短路+枚举)

    传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...

随机推荐

  1. sqli-labs less 5-6

    sqli-labs less 5-6 从源代码中可以看到,运行返回结果正确的时候只返回you are in....,不会返回数据库当中的信息了,以前的union联合查询就不能用了,开始尝试盲注. 简单 ...

  2. Linux下部署Samba服务环境的操作记录

    关于Linux和Windows系统之间的文件传输,很多人选择使用FTP,相对较安全,但是有时还是会出现一些问题,比如上传文件时,文件名莫名出现乱码,文件大小改变等问题.相比较来说,使用Samba作为文 ...

  3. Linux下selinux简单梳理

    在linux环境下执行某些程序时,偶尔会遇到来一个关于selinux的强制模式不可执行的情况,这种情况下需要关闭selinux或者将enforcing改为permissive模式后才能进行执行.sel ...

  4. 《Linux内核分析》第六周学习笔记

    <Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  5. navicat有数据额结构同步

    这个功能可能检查两个库的表结构异同,进行表结构构同步,可以生成同步语句. 比如在测试环境表中新增了字段,可以通过这个工具进行表结构同步.

  6. 11-Python3从入门到实战—基础之生成器和迭代器

    Python从入门到实战系列--目录 切片 Python提供切片(Slice)操作符用来获取列表.元组等数据中的部分元素:如,读取列表 list[m:n]:表示获取m-n区间的元素 list[m:n: ...

  7. Maven修改默认JDK

    Maven修改默认JDK 问题: 1.创建maven项目的时候,jdk版本是1.5版本,而自己安装的是1.7或者1.8版本. 2.每次右键项目名-maven->update project 时候 ...

  8. 查询部门----返回给前台TreeView数据格式的数据

    实体类: public class AddressTreeDto { private Long id; private String text;//位置名称 private Long pId;//上一 ...

  9. lsof 查看端口占用的进程ID

    1. nohup execute >/dev/null 2>&1 & 提交了一个后台jobs 2. 然后查看一下 哪个进程正在用 3. yum 安装lsof yum ins ...

  10. SQLSERVER 备份数据库的注意事项

    1. SQLSERVER 有一个压缩备份集的功能,能够实现大概15%的压缩比(跟数据类型不同而不同) 之前竟然没发现...浪费了好多磁盘资源.. 多学习多思考..