P2245 星际导航

题目描述

sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好。为了方便起见,我们可以认为宇宙是一张有N 个顶点和M 条边的带权无向图,顶点表示各个星系,两个星系之间有边就表示两个星系之间可以直航,而边权则是航行的危险程度。

sideman 现在想把危险程度降到最小,具体地来说,就是对于若干个询问(A, B),sideman 想知道从顶点A 航行到顶点B 所经过的最危险的边的危险程度值最小可能是多少。作为sideman 的同学,你们要帮助sideman 返回家园,兼享受安全美妙的宇宙航行。所以这个任务就交给你了。

输入输出格式

输入格式:

第一行包含两个正整数N 和M,表示点数和边数。

之后 M 行,每行三个整数A,B 和L,表示顶点A 和B 之间有一条边长为L 的边。顶点从1 开始标号。

下面一行包含一个正整数 Q,表示询问的数目。

之后 Q 行,每行两个整数A 和B,表示询问A 和B 之间最危险的边危险程度的可能最小值。

输出格式:

对于每个询问, 在单独的一行内输出结果。如果两个顶点之间不可达, 输出impossible。

说明

对于40% 的数据,满足N≤1000,M≤3000,Q≤1000。

对于 80% 的数据,满足N≤10000,M≤105,Q≤1000。

对于 100% 的数据,满足N≤105,M≤3×105,Q≤105,L≤109。数据不保证没有重边和自环。


真是的,不爱倍增了,拍了好久啊。。

思路:求最小生成树以后打树上倍增

错误点:

倍增跳到同一深度后没有判是否已经相等

堆优化的prim应该不是每次进队都加边

倍增同一深度后向上跳时应该先更新答案再跳(我居然可以错的这么蠢。。)


Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. using namespace std;
  5. const int N=100010;
  6. int head0[N],edge0[N<<1],to0[N<<1],next0[N<<1],cnt0;
  7. void add0(int u,int v,int w)
  8. {
  9. edge0[++cnt0]=w;to0[cnt0]=v;next0[cnt0]=head0[u];head0[u]=cnt0;
  10. }
  11. int head[N],edge[N<<1],to[N<<1],next[N<<1],cnt;
  12. void add(int u,int v,int w)
  13. {
  14. edge[++cnt]=w;to[cnt]=v;next[cnt]=head[u];head[u]=cnt;
  15. }
  16. int used[N],m,n,Q,dep[N],anc[N];
  17. void dfs(int now,int an)
  18. {
  19. used[now]=1;
  20. anc[now]=an;
  21. for(int i=head0[now];i;i=next0[i])
  22. {
  23. int v=to0[i],w=edge0[i];
  24. if(!used[v])
  25. dfs(v,an);
  26. }
  27. }
  28. void init()
  29. {
  30. memset(used,0,sizeof(used));
  31. for(int i=1;i<=n;i++)
  32. if(!used[i])
  33. {
  34. dfs(i,i);
  35. add0(0,i,0);
  36. }
  37. }
  38. struct node
  39. {
  40. int from,to,w;
  41. bool friend operator <(node n1,node n2)
  42. {
  43. return n1.w>n2.w;
  44. }
  45. node(){}
  46. node(int from,int to,int w)
  47. {
  48. this->from=from;
  49. this->to=to;
  50. this->w=w;
  51. }
  52. };
  53. priority_queue <node > q;
  54. void prim()
  55. {
  56. memset(used,0,sizeof(used));
  57. for(int i=head0[0];i;i=next0[i])
  58. {
  59. int v=to0[i],w=edge0[i];
  60. node tt(0,v,w);
  61. q.push(tt);
  62. }
  63. int cntt=0;
  64. while(!q.empty()&&cntt<n)
  65. {
  66. int u=q.top().to;
  67. if(used[u]) {q.pop();continue;}
  68. add(q.top().from,q.top().to,q.top().w);
  69. add(q.top().to,q.top().from,q.top().w);
  70. used[u]=1;
  71. cntt++;
  72. q.pop();
  73. for(int i=head0[u];i;i=next0[i])
  74. {
  75. int v=to0[i],w=edge0[i];
  76. if(!used[v])
  77. {
  78. node tt(u,v,w);
  79. q.push(tt);
  80. }
  81. }
  82. }
  83. }
  84. int f[N][21],fw[N][21];
  85. void dfs2(int now)
  86. {
  87. used[now]=1;
  88. for(int i=head[now];i;i=next[i])
  89. {
  90. int v=to[i],w=edge[i];
  91. if(!used[v])
  92. {
  93. f[v][0]=now;
  94. fw[v][0]=w;
  95. dep[v]=dep[now]+1;
  96. dfs2(v);
  97. }
  98. }
  99. }
  100. void init2()
  101. {
  102. memset(used,0,sizeof(used));
  103. dfs2(0);
  104. for(int j=1;j<=20;j++)
  105. for(int i=0;i<=n;i++)
  106. {
  107. f[i][j]=f[f[i][j-1]][j-1];
  108. fw[i][j]=max(fw[i][j-1],fw[f[i][j-1]][j-1]);
  109. }
  110. }
  111. void query(int x,int y)
  112. {
  113. int ans=0;
  114. if(dep[x]<dep[y]) swap(x,y);
  115. for(int i=20;i>=0;i--)
  116. if(dep[f[x][i]]>=dep[y])
  117. {
  118. ans=max(ans,fw[x][i]);
  119. x=f[x][i];
  120. }
  121. for(int i=20;i>=0;i--)
  122. if(f[x][i]!=f[y][i])
  123. {
  124. ans=max(ans,max(fw[x][i],fw[y][i]));
  125. x=f[x][i],y=f[y][i];
  126. }
  127. if(x!=y)
  128. ans=max(ans,max(fw[x][0],fw[y][0]));
  129. printf("%d\n",ans);
  130. }
  131. int main()
  132. {
  133. freopen("data.out","r",stdin);
  134. freopen("bf.out","w",stdout);
  135. scanf("%d%d",&n,&m);
  136. int u,v,w;
  137. for(int i=1;i<=m;i++)
  138. {
  139. scanf("%d%d%d",&u,&v,&w);
  140. add0(u,v,w),add0(v,u,w);
  141. }
  142. init();
  143. prim();
  144. init2();
  145. scanf("%d",&Q);
  146. for(int i=1;i<=Q;i++)
  147. {
  148. scanf("%d%d",&u,&v);
  149. if(anc[u]!=anc[v])
  150. printf("impossible\n");
  151. else
  152. query(u,v);
  153. }
  154. return 0;
  155. }

2018.6.30

洛谷 P2245 星际导航 解题报告的更多相关文章

  1. [洛谷P2245]星际导航

    题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少. 解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已.所以具体思路见货车运输. ...

  2. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  3. 洛谷 P4597 序列sequence 解题报告

    P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...

  4. 洛谷1087 FBI树 解题报告

    洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...

  5. 洛谷 P3349 [ZJOI2016]小星星 解题报告

    P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...

  6. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  7. 洛谷 P4705 玩游戏 解题报告

    P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...

  8. 洛谷 P1272 重建道路 解题报告

    P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...

  9. 洛谷 [HNOI2014]道路堵塞 解题报告

    [HNOI2014]道路堵塞 题意 给一个有向图并给出一个这个图的一个\(1\sim n\)最短路,求删去这条最短路上任何一条边后的最短路. 又事SPFA玄学... 有个结论,新的最短路一定是\(1\ ...

随机推荐

  1. 20155233 《网络对抗》Exp2 后门原理与实践

    实验过程 1.Win获得Linux Shell windows:使用ipconfig指令查看本机ip: windows:使用ncat命令打开监听: Linux反弹连接win: 输入 nc window ...

  2. # 20155337《网络对抗》Exp6 信息搜集与漏洞扫描

    20155337<网络对抗>Exp6 信息搜集与漏洞扫描 实践目标 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测 ...

  3. 带阴影的圆形 QLabel

    带阴影的圆形 Label 来自: 公孙二狗

  4. [CF1009G]Allowed Letters[贪心+霍尔定理]

    题意 给你一个长为 \(n\) 的串,字符集为 \(a,b,c,d,e,f\) .你可以将整个串打乱之后重新放置,但是某些位置上有一些限制:必须放某个字符集的字符.问字典序最小的串,如果无解输出 &q ...

  5. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  6. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  7. JVM技术周报第1期

    JVM技术周报 · 第1期 JVM技术每周分享整理了JVM技术交流群每周讨论的内容,由群内成员整理归纳而成.如果你有兴趣入群讨论,请关注「Java技术精选」公众号,通过右下角菜单「入群交流」加我好友, ...

  8. web api token验证理解

    最近一直在学习web api authentication,以Jwt为例,可以这样理解,token是身份证,用户名和密码是户口本,身份证是有有效期的(jwt 有过期时间),且携带方便(自己带有所有信息 ...

  9. asp.net web api参数

    翻译自:http://www.c-sharpcorner.com/article/parameter-binding-in-asp-net-web-api/ 主要自己学习下,说是翻译,主要是把文章的意 ...

  10. GTX1060 深度学习工具链

    通过试错,推荐GTX1060 WIN10的工具链记录如下: GPU: GTX 1060 6G OS: WIN10 CUDA:9.0 CuDNN:7.1.3 Tensorflow: Tensorflow ...