P1099 树网的核
NOIP 2007 提高第四题。
啊......我还是看了题解才做出来的。
这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊!
然后,这破题怎么暴力?感觉我的spfa,dijkstra都WA2了...
最后还是跑去看了题解。
一步一步慢慢模拟就出来了。
首先,肯定要跑floyd的。
然后,我们居然还要个邻接表来存图......(用来dfs求直径)
无脑Floyd的同时,记录一条直径的起点,终点。
find_d求了一条直径上的所有点。
然后find_f求出了直径上每个点不超过s能去的最远点。
然后对于每段直径上小于s的路径,求出每个点的min的max作为偏心距,然后再求min。
然后输出,成功。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 int chart[301][301],n,s,top,d; 6 struct Edge 7 { 8 int u,v,len,next; 9 }edge[601]; 10 int point_e[301],d_f[301][2],topd;///0dian 1xiabiao 11 bool vis[301]; 12 void add(int x,int y,int z) 13 { 14 top++; 15 edge[top].u=x; 16 edge[top].v=y; 17 edge[top].len=z; 18 edge[top].next=point_e[x]; 19 point_e[x]=top; 20 return; 21 } 22 /// 23 bool find_d(int a,int b) 24 { 25 if(a==b) 26 { 27 d_f[++topd][0]=b; 28 return 1; 29 } 30 if(vis[a]) return 0; 31 vis[a]=1; 32 int i=point_e[a]; 33 while(i) 34 { 35 if(find_d(edge[i].v,b)) 36 { 37 d_f[++topd][0]=a; 38 vis[a]=0; 39 return 1; 40 } 41 i=edge[i].next; 42 } 43 vis[a]=0; 44 return 0; 45 } 46 void find_f(int k) 47 { 48 int i=k; 49 for(;i<=topd;i++) 50 { 51 if(chart[d_f[k][0]][d_f[i][0]]>s) break; 52 } 53 i--; 54 d_f[k][1]=i; 55 return; 56 } 57 int find_ans(int k) 58 { 59 int ans=0,now=9999998; 60 for(int i=1;i<=n;i++) 61 { 62 now=9999997; 63 for(int j=k;j<=d_f[k][1];j++) 64 { 65 now=min(now,chart[i][d_f[j][0]]); 66 } 67 ans=max(ans,now); 68 } 69 return ans; 70 } 71 int main() 72 { 73 memset(chart,0x3f,sizeof(chart)); 74 scanf("%d%d",&n,&s); 75 for(int i=1;i<=n;i++) chart[i][i]=0; 76 int x,y,z; 77 for(int i=1;i<n;i++) 78 { 79 scanf ("%d%d%d",&x,&y,&z); 80 chart[x][y]=chart[y][x]=z; 81 add(x,y,z); 82 add(y,x,z); 83 } 84 int da,db; 85 for(int k=1;k<=n;k++) 86 { 87 for(int i=1;i<=n;i++) 88 { 89 for(int j=1;j<=n;j++) 90 { 91 if(chart[i][j]>chart[i][k]+chart[k][j]) 92 { 93 chart[i][j]=chart[i][k]+chart[k][j]; 94 if(chart[i][j]>d) 95 { 96 d=chart[i][j]; 97 da=i;db=j; 98 } 99 } 100 } 101 } 102 } 103 /// 104 /** 105 for(int i=1;i<=n;i++) 106 { 107 for(int j=1;j<=n;j++) 108 { 109 printf("%d ",chart[i][j]); 110 } 111 printf("\n"); 112 } 113 */ 114 /// 115 find_d(da,db); 116 for(int i=1;i<=topd;i++) find_f(i); 117 /// 118 /** 119 for(int i=1;i<=topd;i++) printf("%d ",d_f[i][0]); 120 printf("\n"); 121 for(int i=1;i<=topd;i++) printf("%d ",d_f[i][1]); 122 */ 123 /// 124 int now,ans=9999999; 125 for(int i=1;i<=topd;i++) 126 { 127 now=find_ans(i); 128 //printf("find_ans(%d)=%d\n",i,now); 129 ans=min(ans,now); 130 } 131 printf("%d",ans); 132 return 0; 133 }
AC代码在此
这个纯暴力模拟题居然是蓝题...说明了我的暴力功力还不够。以后还要练搜索剪枝的。先做点USACO吧。
(logeadd:133行代码怎么不能是蓝题了?好像有点道理啊...)
转载于:https://www.cnblogs.com/huyufeifei/p/8595521.html
P1099 树网的核相关推荐
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- 洛谷P1099 树网的核
传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...
- [O(N)的我不会]树网的核
[题目描述] 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V, E分别表示结点与边的集合,W表示各边长度的集 ...
- 树网的核(codevs 1167)
题目描述 Description [问题描述] 设 T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我 们称T 为树网(treenetwork),其中V, E分 ...
- NOIP2007 树网的核 [BZOJ2282][Sdoi2011]消防
NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之 ...
- 树网的核 Vijos1362 NOIP2007 树结构 直径 暴搜
题面在最下方. 树结构的题做多了就会发现,本题所谓的树网的核(一段偏心距ECC最小的路径)一定是在树的直径上的. 我刚开始做的时候没想到这个,然后写了三个dfs讨论每条直径 Orz 其实只要认识到了这 ...
- VIJOS 1362 树网的核
描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并设T ...
- 2017.3.21 树网的核 思考记录
把这个noip的题搞出来了.. 不是很难,而且我的要求也比较高(虽然以前看到这种题都是直接看题解,因为太复杂不会) 虽然搞出来在luogu 的noip数据 A了,但bzoj还是T了.理论上应该是O(n ...
- code1167 树网的核
floyd+枚举 看点: 1.floyd同时用数组p记录转移节点k,这样知道线段的端点u v就可以得到整条线段 2.任意一点c到线段a b的距离=(d[a][c]+d[c][b]-d[a][b])/2 ...
最新文章
- 网页里显示访问的那台服务器,在web服务器中把网页放在那里,才能被访问
- Java机器学习库ML之四模型训练和预测示例
- UART的FIFO功能
- 我为什么选择在北上广深打拼?
- 线上故障排查全套路盘点,运维大哥请自查!
- 对应chd5.14的spark_GitHub - shixiaopengql/BigData-News: 基于Spark2.2新闻网大数据实时系统项目...
- 简书自动上传工具出现多余空行的问题及解决方案
- Activiti 中的 命令模式与责任链模式
- spring mvc学习(7):springmvc学习笔记(常用注解)
- 1.4编程基础之逻辑表达式与条件分支 18 点和正方形的关系
- react特性-声明式编程
- 大数据之-Hadoop完全分布式_RM启动注意事项---大数据之hadoop工作笔记0041
- 那年学过的Java笔记三核心类库三
- windows利用DOS窗口编译C++文件
- 最新emoji表情代码大全_NO.3 如何用Emoji迷惑人类
- LabVIEW编程LabVIEW开发 Kepco ABC程控电源 例程与相关资料
- python寻找完全平方数,Python3 完全平方数案例
- 查看显卡型号命令_如何查看电脑显卡型号配置 快速查看显卡配置信息方法
- 发现新的恶意 Torii IoT 僵尸网络
- FFmpeg进行音频的解码和播放