更好的阅读体验

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. session,cookie,sessionStorage,localStorage的相关设置以及获取删除

    一.cookie 什么是 Cookie? "cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScrip ...

  2. Vue躬行记(3)——样式和表单

    Vue对DOM元素的class和style两个特性做了专门的增强,即对CSS类和内联样式做了一层封装,通过v-bind指令来处理它们,而接收的表达式既可以是简单的字符串.对象或数组,也可以是复杂的计算 ...

  3. Vue-CLI项目快速UI布局-element-ui

    0902自我总结 Vue-CLI项目快速UI布局-element-ui 一.element-ui的地址 https://element.eleme.cn/ 二.element-ui的安装 <!- ...

  4. 微信小程序登入流程

    微信小程序登入流程 一.首先前端先传code去后端 wx.login({ success(res) { if (res.code) { //发起网络请求 wx.request({ url: app.g ...

  5. java位运算,逻辑运算符

    位运算逻辑运算符包括: 与(&),非(~),或(|),异或(^). &:  条件1&条件2  ,只有条件1和条件2都满足, 整个表达式才为真true,  只要有1个为false ...

  6. 控制反转和依赖注入(对IOC,DI理解+案例)

    理解 控制反转说的官方一点就是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其实就是一种设计思想,大概思想就是把设计好的对象交给容器控制,而不是在你内部直接控制. 依赖注入是控制反 ...

  7. [Abp vNext 源码分析] - 11. 用户的自定义参数与配置

    一.简要说明 文章信息: 基于的 ABP vNext 版本:1.0.0 创作日期:2019 年 10 月 23 日晚 更新日期:暂无 ABP vNext 针对用户可编辑的配置,提供了单独的 Volo. ...

  8. 案例_(单线程)使用xpath爬取糗事百科

    案例_(单线程)使用xpath爬取糗事百科 步骤如下: 首先通过xpath插件找出我们要爬取的信息的匹配规则 url = "https://www.qiushibaike.com/8hr/p ...

  9. 微服务架构 ------ Day01 微服务架构优缺点

    1. 微服务架构的优点 庞大的单体程序 -> 一套微型程序. 每一个服务有明确的边界(服务之间的消息通讯机制) ,每一个服务都能单独的开发和维护,并且更好理解 每一个服务都能由一个团队来开发,当 ...

  10. 彻底解决 Mechanism level: Failed to find any Kerberos tgt

    错误描述 Secure Client Cannot Connect ([Caused by GSSException: No valid credentials provided(Mechanism ...