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

// luogu-judger-enable-o2
/*
Problem: P2296 【寻找道路】
Author: 航空信奥
Date: 2018/08/16
*/
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define Clear(a, x) memset(a, x, sizeof(a))
using namespace std; namespace hkxa { /* 防重名 */
inline char Getchar();
template <typename _TpInt> inline _TpInt read();
template <typename _TpInt> inline void write(_TpInt x); # define Max_N vector<int> to[Max_N];
vector<int> fr[Max_N]; /* 反图 */
int n, m;
int start, finish;
bool alive[Max_N] = {};
int dis[Max_N] = {}; void live()
{
bool temp_alive[Max_N] = {};
queue <int> q;
q.push(finish);
temp_alive[finish] = ;
int point;
while (!q.empty()) {
point = q.front();
q.pop();
for (int i = ; i < fr[point].size(); i++) {
if (!temp_alive[fr[point][i]]) {
q.push(fr[point][i]);
temp_alive[fr[point][i]] = ;
}
}
}
Clear(alive, );
for (int i = ; i <= n; i++) {
if (!temp_alive[i]) {
alive[i] = ;
for (int j = ; j < fr[i].size(); j++) {
alive[fr[i][j]] = ;
}
}
}
} void spfa()
{
Clear(dis, 0x3f);
dis[start] = ;
queue <int> q;
q.push(start);
int point;
while (!q.empty()) {
point = q.front();
q.pop();
for (int i = ; i < to[point].size(); i++) {
if (alive[to[point][i]] && dis[point] + < dis[to[point][i]]) {
q.push(to[point][i]);
dis[to[point][i]] = dis[point] + ;
}
}
}
} int main()
{
n = read<int>();
m = read<int>();
int f, t;
for (int i = ; i < m; i++) {
f = read<int>();
t = read<int>();
to[f].push_back(t);
fr[t].push_back(f);
}
start = read<int>();
finish = read<int>(); live();
spfa();
if (dis[finish] == 0x3f3f3f3f)
dis[finish] = -;
write(dis[finish]);
puts(""); return ;
} char BufferRead[ << ];
int rLen = , rPos = ;
inline char Getchar()
{
if (rPos == rLen) rPos = , rLen = fread(BufferRead, , << , stdin);
if (rPos == rLen) return EOF;
return BufferRead[rPos++];
} template <typename _TpInt>
inline _TpInt read()
{
register int flag = ;
register char c = Getchar();
while ((c > '' || c < '') && c != '-')
c = Getchar();
if (c == '-') flag = -, c = Getchar();
register _TpInt init = (c & );
while ((c = Getchar()) <= '' && c >= '')
init = (init << ) + (init << ) + (c & );
return init * flag;
} template <typename _TpInt>
inline void write(_TpInt x)
{
if (x < ) {
putchar('-');
write<_TpInt>(~x + );
}
else {
if (x > ) write<_TpInt>(x / );
putchar(x % + '');
}
}
} int main()
{
hkxa::main();
return ;
}

洛谷 题解 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. 花一天时间试玩vsphere6.7(EXSI)服务器版的vmware

    花一天时间试玩vsphere6.7(EXSI)服务器版的vmware 要注册账号(2019年11月14注册): 登陆网址:https://my.vmware.com/cn/group/vmware/h ...

  2. JavaScript with Image:创建缩略图

    当图片很大,直接把图片从Server下载到浏览器上看是一种很不明智的做法,浪费了服务器的资源,网络带宽和客户端的资源.所以,通常Server和Client之间会传输缩略图,只有当Client请求某张图 ...

  3. Laravel 5 - 文件上传

    一.简介 Laravel 有很棒的文件系统抽象层,是基于 Frank de Jonge 的 Flysystem 扩展包. Laravel 集成的 Flysystem 提供了简单的接口,可以操作本地端空 ...

  4. PowerMock学习之PoweMock的入门(二)

    前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...

  5. 并发编程-硬件加持的CAS操作够快么?

    Talk is cheap CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新 ...

  6. thinkphp 6.0 在 initialize 中重定向无效

    thinkphp 6.0 在 initialize 中重定向无效 改用 header() 函数 实例: // header('location:/index.php/模块/控制器/方法'); head ...

  7. linux文件时间

    Linux 查看文件修改时间(精确到秒)(简单) ls --full-time 查看文件时间戳命令:stat test.txt linux 下查看文件修改时间 等(详细) 查看文件时间戳命令:stat ...

  8. [Odoo12基础教程]之win10中odoo12环境搭建

    所需材料 1.python3.7 2.pycharm社区版及以上 3.postgresSQL10 下载链接:https://www.enterprisedb.com/thank-you-downloa ...

  9. 【Luogu P2471】[SCOI2007]降雨量

    Luogu P2471 啊啊啊啊这真是一道史上最毒瘤的题目!!!!! 题意就是给出n个年份的降雨量 询问:"自从\(y\)年以来\(x\)年的降雨量最大"的正确性. 显然有多种情况 ...

  10. Python文件和数据格式化(教程)

    文件是一个存储在副主存储器的数据序列,可包含任何数据内容. 概念上,文件是数据的集合和抽象,类似的,函数是程序的集合和抽象. 用文件形式组织和表达数据更有效也更加灵活. 文件包括两种形式,文本文件和二 ...