Problem

P2296 【寻找道路】

solution

首先声明,这题我用了spfa,而:

关于spfa:它死了。

杀手: NOI 2018−T1 出题人

感谢出题人,没有卡spfa

  • 用时: 20ms
  • 空间: 5082KB(4.74MB)
  • 代码长度: 3.32KB
  • 提交记录: R9776986

先说思路:

  1. 首先,要处理出哪些点不能直接或间接与终点连通

    • 函数:void live(void)
    • 这里的方法是建反图跑spfa
    • 不能直接或间接与终点连通的点存在temp_alive数组里,1为活着,0为死了
  2. 其次,要把所有指向不能直接或间接与终点连通的那些点的那些点设置为死了
    • 在函数live()里执行
    • 存到alive数组,1为活着,0为死了
    • 注意:第二步的结果不能直接直接存储在第一步的数组里,否则会杀掉一些有用的点
  3. 一遍spfa求最短路,求的过程中排除所有那些死了的点。
    • 函数:void spfa(void)
    • 注意路径长度均为1
  4. 完结散花♪(^∇^*)

Code

  1. // luogu-judger-enable-o2
  2. /*
  3. Problem: P2296 【寻找道路】
  4. Author: 航空信奥
  5. Date: 2018/08/16
  6. */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <vector>
  10. #include <queue>
  11. #define Clear(a, x) memset(a, x, sizeof(a))
  12. using namespace std;
  13.  
  14. namespace hkxa { /* 防重名 */
  15. inline char Getchar();
  16. template <typename _TpInt> inline _TpInt read();
  17. template <typename _TpInt> inline void write(_TpInt x);
  18.  
  19. # define Max_N
  20.  
  21. vector<int> to[Max_N];
  22. vector<int> fr[Max_N]; /* 反图 */
  23. int n, m;
  24. int start, finish;
  25. bool alive[Max_N] = {};
  26. int dis[Max_N] = {};
  27.  
  28. void live()
  29. {
  30. bool temp_alive[Max_N] = {};
  31. queue <int> q;
  32. q.push(finish);
  33. temp_alive[finish] = ;
  34. int point;
  35. while (!q.empty()) {
  36. point = q.front();
  37. q.pop();
  38. for (int i = ; i < fr[point].size(); i++) {
  39. if (!temp_alive[fr[point][i]]) {
  40. q.push(fr[point][i]);
  41. temp_alive[fr[point][i]] = ;
  42. }
  43. }
  44. }
  45. Clear(alive, );
  46. for (int i = ; i <= n; i++) {
  47. if (!temp_alive[i]) {
  48. alive[i] = ;
  49. for (int j = ; j < fr[i].size(); j++) {
  50. alive[fr[i][j]] = ;
  51. }
  52. }
  53. }
  54. }
  55.  
  56. void spfa()
  57. {
  58. Clear(dis, 0x3f);
  59. dis[start] = ;
  60. queue <int> q;
  61. q.push(start);
  62. int point;
  63. while (!q.empty()) {
  64. point = q.front();
  65. q.pop();
  66. for (int i = ; i < to[point].size(); i++) {
  67. if (alive[to[point][i]] && dis[point] + < dis[to[point][i]]) {
  68. q.push(to[point][i]);
  69. dis[to[point][i]] = dis[point] + ;
  70. }
  71. }
  72. }
  73. }
  74.  
  75. int main()
  76. {
  77. n = read<int>();
  78. m = read<int>();
  79. int f, t;
  80. for (int i = ; i < m; i++) {
  81. f = read<int>();
  82. t = read<int>();
  83. to[f].push_back(t);
  84. fr[t].push_back(f);
  85. }
  86. start = read<int>();
  87. finish = read<int>();
  88.  
  89. live();
  90. spfa();
  91. if (dis[finish] == 0x3f3f3f3f)
  92. dis[finish] = -;
  93. write(dis[finish]);
  94. puts("");
  95.  
  96. return ;
  97. }
  98.  
  99. char BufferRead[ << ];
  100. int rLen = , rPos = ;
  101. inline char Getchar()
  102. {
  103. if (rPos == rLen) rPos = , rLen = fread(BufferRead, , << , stdin);
  104. if (rPos == rLen) return EOF;
  105. return BufferRead[rPos++];
  106. }
  107.  
  108. template <typename _TpInt>
  109. inline _TpInt read()
  110. {
  111. register int flag = ;
  112. register char c = Getchar();
  113. while ((c > '' || c < '') && c != '-')
  114. c = Getchar();
  115. if (c == '-') flag = -, c = Getchar();
  116. register _TpInt init = (c & );
  117. while ((c = Getchar()) <= '' && c >= '')
  118. init = (init << ) + (init << ) + (c & );
  119. return init * flag;
  120. }
  121.  
  122. template <typename _TpInt>
  123. inline void write(_TpInt x)
  124. {
  125. if (x < ) {
  126. putchar('-');
  127. write<_TpInt>(~x + );
  128. }
  129. else {
  130. if (x > ) write<_TpInt>(x / );
  131. putchar(x % + '');
  132. }
  133. }
  134. }
  135.  
  136. int main()
  137. {
  138. hkxa::main();
  139. return ;
  140. }

洛谷 题解 P2296 【寻找道路】的更多相关文章

  1. 洛谷P2296 寻找道路==codevs3731 寻找道路

    P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  2. 洛谷——P2296 寻找道路

    P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  3. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  4. DP【洛谷P1704】 寻找最优美做题曲线

    [洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...

  5. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  6. 洛谷P2296 寻找道路 [拓扑排序,最短路]

    题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  7. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  8. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  9. 洛谷P4319 变化的道路

    题意:给定图,每条边都有一段存在时间.求每段时间的最小生成树. 解:动态MST什么毒瘤...洛谷上还是蓝题... 线段树分治 + lct维护最小生成树. 对时间开线段树,每条边的存在时间在上面会对应到 ...

随机推荐

  1. [多态] java笔记之多态性

    1.多态,说的是对象,说的不是类. 2. 3.多态 = polymorphism 4. 调用如下: 5. 6.口诀: 7.对象的向上转型: 8.对象的向下转型: 9.下面这个异常叫做ClassCast ...

  2. nyoj 21-三个水杯(BFS)

    21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...

  3. [ubuntu篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录

    为了更好的阅读体验,欢迎阅读原文.原文链接在此. Part 1: Using Github Pages and Hexo to manage personal blogs. Series Part 1 ...

  4. 报错:尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

    问题: 在写windows服务时,发布后日志报错:尝试加载 Oracle 客户端库时引发 BadImageFormatException.如果在安装 32 位 Oracle 客户端组件的情况下以 64 ...

  5. cognos服务器性能测试诊断分析优化过程记录

    前段时间客户方一个系统上线后出现性能问题,就是查询报表的时候出现宕机现象,应项目组要求过去帮忙测试优化问题.  该项目的架构相对比较复杂,登录后要先进行认证服务器认证用户然后登录到应用系统A,在跳转到 ...

  6. Redis集群同步问题

    之前被面试官问到:Redis集群中主从数据同步是从库异步读取主库,那么Redis集群其他主与主之间的数据是怎么共享的呢?或者说是怎么同步的? emmmm……当时我就懵逼了,这不是考试范围啊卧槽~只能老 ...

  7. PIC18F45K80串口1和串口2异步收发通信实例

    PIC18F45K80串口1和串口2异步收发通信实例 一:配置串口1初始化函数 首先打开技术手册,查看异步串口的操作流程以及配置. 需要将串口对应引脚的方向寄存器设置为输入

  8. Mysql查询语句之排序查询

    语法: /* select 查询列表 from 表 [where 筛选条件] order by 排序列表 [asc/desc] */ ①asc为升序,desc为降序,且默认为升序 ②order by子 ...

  9. 关于vue中的videoPlayer的src视频地址参数动态修改(网上一堆错误方法,被误导很久,自己找到了正确的方法,供大家借鉴)

    方法很简单:相信大家的问题应该是改变src的值吧,动态赋值这一步简单.this.playerOptions['sources'][0]['src'] 就是这一步解决提取src问题,主要部分用绿色框起来 ...

  10. 通过Python将Excel表格信息导入数据库

    前言 公司原采用Excel表格方式记录着服务器资产信息,随着业务的增加,相应的硬件资产也增加,同时物理机虚拟化出多台虚拟机,存在表格管理杂乱.变更资产信息不能及时相互同步, 为了紧跟时代的步伐,老大搞 ...