更好的阅读体验

Portal

Portal1: Luogu

Portal2: LibreOJ

Description

在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

  1. 路径上的所有点的出边所指向的点都直接或间接与终点连通。

  2. 在满足条件\(1\)的情况下使路径最短。

    注意:图\(\mathrm G\)中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条件的路径的长度。

Input

第一行有两个用一个空格隔开的整数\(n\)和\(m\),表示图有\(n\)个点和\(m\)条边。

接下来的\(m\)行每行\(2\)个整数\(x, y\),之间用一个空格隔开,表示有一条边从点\(x\)指向点\(y\)。

最后一行有两个用一个空格隔开的整数\(s, t\),表示起点为\(s\),终点为\(t\)。

Output

输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。

如果这样的路径不存在,输出\(-1\)。

Sample Input1

3 2
1 2
2 1
1 3

Sample Output1

-1

Sample Input2

6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5

Sample Output2

3

Solution

我们先看一个例子:

不妨令起点为\(1\),终点为\(3\)。

这个例子的答案是\(3\),路径是\(1 \to 4 \to 5 \to 3\)。

我们可以先检验出每一个点是否能到终点。可以从终点出发,按照反向边走一遍,然后把走不到的点以及它的入边连的点都删除,像这样:

最后在跑一边\(bfs\)序,求出最短路就可以了。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue> using namespace std; const int MAXN = 200005;
struct EDGE {
int to, nxt;
} edge1[MAXN], edge2[MAXN];
int n, m, u, v, S, T, cnt1, cnt2, dis[MAXN], head1[MAXN], head2[MAXN];
bool vis[MAXN];
inline void addedge(int u, int v) {//邻接表存图
edge1[++cnt1].to = v; edge1[cnt1].nxt = head1[u]; head1[u] = cnt1;
edge2[++cnt2].to = u; edge2[cnt2].nxt = head2[v]; head2[v] = cnt2;//反向边
}
inline void bfs1(int cur) {
queue<int> Q;
Q.push(cur);
vis[cur] = 1;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for (int i = head2[u]; ~i; i = edge2[i].nxt) {//遍历每一个点
int v = edge2[i].to;
if (!vis[v]) {
vis[v] = 1;
Q.push(v);
}
}
}
}
inline bool check(int u) {//判断是否能到达终点
for (int i = head1[u]; ~i; i = edge1[i].nxt)
if (!vis[edge1[i].to]) return 0;
return 1;
}
inline bool bfs2(int cur) {
queue<int> Q;
Q.push(cur);
while (!Q.empty()) {
int u = Q.front();
Q.pop();
if (!check(u)) continue;
for (int i = head1[u]; ~i; i = edge1[i].nxt) {//遍历每一个点
int v = edge1[i].to;
if (dis[v] == -1) {
dis[v] = dis[u] + 1;
Q.push(v);
if (v == T) {
printf("%d\n", dis[T] + 1);
return 1;
}
}
}
}
return 0;
}
int main() {
scanf("%d%d", &n, &m);
memset(head1, -1, sizeof(head1));
memset(head2, -1, sizeof(head2));
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
addedge(u, v);//加边
}
scanf("%d%d", &S, &T);
bfs1(T);//求出终点能到的点
memset(dis, -1, sizeof(dis));
if (!bfs2(S)) printf("-1\n");
return 0;
}

Attachment

测试数据下载:https://www.lanzous.com/i5qa0pg

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

  1. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

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

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

  3. 洛谷——P2296 寻找道路

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

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

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

  5. 洛谷 P2296 寻找道路 题解

    每日一题 day42 打卡 Analysis 首先,预处理,把每条边反向. 从终点开始bfs,标记从终点开始可以走到的点. 第二步,枚举每一个点,如果这个点没有被标记,则枚举它的每一条出边(反向后的) ...

  6. [NOIP2014] 提高组 洛谷P2296 寻找道路

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

  7. NOIP2014 day2 T2 洛谷P2296 寻找道路

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

  8. 洛谷 [P2296] 寻找道路

    反向BFS预处理,求出所有符合题意的点,再正向BFS,(注意对于边权恒为一的点,BFS,比SPFA高效) 输入时n与m分清 #include <iostream> #include < ...

  9. 洛谷 P2296 寻找道路 —— bfs

    题目:https://www.luogu.org/problemnew/show/P2296 第一次用 Emacs 对拍,写了半天: 注意那个 is 赋值的地方很容易错,千万别反复赋值: 一道水题写了 ...

随机推荐

  1. 区间 GCD

    区间 GCD题目描述最近 JC 同学刚学会 gcd,于是迷上了与 gcd 有关的问题.今天他又出了一道这样的题目,想要考考你,你能顺利完成吗?给定一个长度为 n 的字符串 s[1..n],串仅包含小写 ...

  2. Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 10.x

    运行Reac项目报: Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js ...

  3. Bitset改进你的程序质量

    1:Bitset介绍 BitSet 是用于存储二进制位和对二进制进行操作的 Java 数据结构, 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的整数将 B ...

  4. Python flask 构建微电影视频网站☝☝☝

    Python flask 构建微电影视频网站☝☝☝ 1.安装数据库连接依赖包 pip install flask-sqlalchemy 2.创建movie数据库 在CentOS虚拟机,进入MaridD ...

  5. F#周报2019年第42期

    新闻 TypeShape的性能 .NET Core 3.0包含.NET Framework API移植项目 宣告.NET Core 3.1预览版1 .NET Core 3.1预览版1中ASP.NET ...

  6. from..import 语句

    from..import 语句 如果你希望直接将 argv 变量导入你的程序(为了避免每次都要输入 sys.),那么你可以通过使用 from sys import argv 语句来实现这一点. 警告: ...

  7. Python:的web爬虫实现及原理(BeautifulSoup工具)

    最近一直在学习python,学习完了基本语法就练习了一个爬虫demo,下面总结下. 主要逻辑是 1)初始化url管理器,也就是将rooturl加入到url管理器中 2)在url管理器中得到新的new_ ...

  8. swap()函数的几种写法及优劣

    试用几种方法实现swap函数,比较效率高低. 首先说结果,最快的是赋值交换. 原因分析 gcc开启O2优化后,三个函数的汇编代码一样.是的,除了第一行的文件名,一模一样. 附代码 void swap1 ...

  9. jmeter基本组件介绍

    常用术语统一:元件-jmeter工具菜单的一个子菜单(功能)  组件-一组元件的集合.如http请求与取样器的的关系  jmeter测试计划要素: (1)脚本中测试计划只能有一个: (2)测试计划中至 ...

  10. 开源造轮子:一个简洁,高效,轻量级,酷炫的不要不要的canvas粒子运动插件库

    一:开篇 哈哈哈,感谢标题党的莅临~ 虽然标题有点夸张的感觉,但实际上,插件库确实是简洁,高效,轻量级,酷炫酷炫的咯.废话不多说,先来看个标配例子吧: (codepen在线演示编辑:http://co ...