P1099 树网的核
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 树网的核的更多相关文章
- 洛谷 P1099 树网的核
P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...
- bzoj1999 / P1099 树网的核
P1099 树网的核 (bzoj数据加强) 前置知识:树的直径 (并不想贴我的智障写法虽然快1倍但内存占用极大甚至在bzoj上MLE) 正常写法之一:用常规方法找到树的直径,在直径上用尺取法找一遍,再 ...
- P1099 树网的核——模拟+树形结构
P1099 树网的核 无根树,在直径上找到一条长度不超过s的路径,使得最远的点距离这条路径的距离最短: 首先两遍dfs找到直径(第二次找的时候一定要吧father[]清零) 在找到的直径下枚举长度不超 ...
- P2491 消防/P1099 树网的核
P2491 消防/P1099 树网的核 双倍经验,双倍快乐. 题意 在一个树上选择一段总长度不超过\(s\)的链使所有点到该链距离的最大值最小. 输出这个最小的值. 做法 Define:以下\(s\) ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- P1099 树网的核 && P2491 [SDOI2011]消防
给定一棵树, 你可以在树的直径上确定一条长度不超过 \(S\) 的链, 使得树上离此链最长的点距离最小, 输出这个距离 P2491 数据范围为 P1099 的 \(1000\) 倍 Solution ...
- #P1099 树网的核 题解
题目描述 pdf 题解 这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵. 已经给出来这是个DAG,所以不用担心连通性的问题.那么怎么做呢? 朴素的做法是把树的直径的两个端点都统计出来 ...
- 洛谷P1099 树网的核
传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...
- 2018.11.06 洛谷P1099 树网的核(最短路+枚举)
传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...
随机推荐
- Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...
- BAT大厂面试流程剖析
在当今互联网中,虽然互联网行业从业者众多,不断崛起的互联网公司也会很多,但如BAT等大厂,仍然是很多同学想要进入的企业.那么本篇文章将会为大家很直白的讲解大厂的面试流程以及侧重点. 首先闲聊一下,为什 ...
- 牛客训练赛25-A-最长区间
https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...
- Individual P1: Summary
经过5个小时成功把simple mode写差不多了..orz 也是蛮拼的. 开始毫无头绪,本能地开始从度娘搜索‘c# 单词统计’= =看了两段代码也算是见过c#的人了.差不多花了我1小时的时间. 然后 ...
- spring cloud bus原理总结
1.spring cloud bus spring cloud是按照spring的配置对一系列微服务框架的集成,spring cloud bus是其中一个微服务框架,用于实现微服务之间的通信. spr ...
- Linux内核第二节
作者:武西垚 深入理解函数调用堆栈 堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 堆栈的作用 函数调用框架 传递参数 保存返回地址 提供局部变量空间 堆栈相关的寄存器 esp,堆栈指针,指 ...
- Apache Shiro Session Management
https://shiro.apache.org/session-management.html#session-management https://shiro.apache.org/session ...
- Git—学习笔记1
Git是一种分布式版本控制工具,现阶段比较流行的版本控制工具主要分为:集中式版本控制工具盒分布式版本控制工具. 集中式版本控制工具:SVN和CVS为代表 集中式版本控制系统(每次都得从SVN服务器数据 ...
- JavaScript从入门到精通
第一(基本语法) if(condition1){ expression1; }else if(condition2){ expression2; }else{ expression3; } switc ...
- Lodop客户端本地角色注册号常见误区
之前写过一篇关于Lodop和c-lodop注册号的区别:LODOP.C-LODOP注册号的区别第一种角色客户端本地打印角色是最常见的角色,最常见的场景,关于c-lodop云打印,它的第一种角色是取代L ...