『题解』洛谷P2296 寻找道路
Portal
Portal1: Luogu
Portal2: LibreOJ
Description
在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:
路径上的所有点的出边所指向的点都直接或间接与终点连通。
在满足条件\(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 寻找道路的更多相关文章
- 『题解』洛谷P1063 能量项链
原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...
- 洛谷P2296 寻找道路==codevs3731 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷——P2296 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷 P2296 寻找道路 题解
每日一题 day42 打卡 Analysis 首先,预处理,把每条边反向. 从终点开始bfs,标记从终点开始可以走到的点. 第二步,枚举每一个点,如果这个点没有被标记,则枚举它的每一条出边(反向后的) ...
- [NOIP2014] 提高组 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- NOIP2014 day2 T2 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- 洛谷 [P2296] 寻找道路
反向BFS预处理,求出所有符合题意的点,再正向BFS,(注意对于边权恒为一的点,BFS,比SPFA高效) 输入时n与m分清 #include <iostream> #include < ...
- 洛谷 P2296 寻找道路 —— bfs
题目:https://www.luogu.org/problemnew/show/P2296 第一次用 Emacs 对拍,写了半天: 注意那个 is 赋值的地方很容易错,千万别反复赋值: 一道水题写了 ...
随机推荐
- python编程基础之二十五
匿名函数:不用def 定义的函数,没有函数名 lambda只是一个表达式,函数体比def简单的多 lambda的函数体不再是代码块 lambda只有一行,增加运行效率 lambda [参数1][参数2 ...
- 大型php网站性能和并发访问优化方案
网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢? ...
- ASP.NET Core API ——Dapper的使用
ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l 创建一个IDBConnection的接口对象 l 编 ...
- Linux下聊天和文件传输软件
全平台聊天软件 米聊 官网地址: http://www.miliao.com 潮信 官网地址: https://www.chaoxin.com
- powershell加载EXE进内存运行
当实战中我们想在目标上运行一些相当复杂的功能,这些功能常是 EXE 文件的一部分.我不想直接在目标上放置一个二进制文件,因为这样可能会触发反病毒机制.一个很好的思路就是将二进制文件嵌入到 Powers ...
- DevSecOps 笔记
什么是DevSecOps “DevSecOps”,一种全新的安全理念与模式,从DevOps的概念延伸和演变而来,其核心理念为安全是整个IT团队(包括开发.运维及安全团队)每个人的责任,需要贯穿从开发到 ...
- opencv实践::对象计数
问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...
- Uipath 选择页面下拉列表中的选项
http://www.rpatokyo.com/ 使用Select item Activity选择页面下拉列表中的选项 在open browser中拖入Select Item Activity,配置参 ...
- java 链接mysql
import java.sql.*; public class ConnectSql { static final String JDBC_DRIVER = "com.mysql.jdbc. ...
- 3M隔音耳罩拆分、清洗教程
简介 3M隔音耳罩用起来真爽,十分适合喜欢安静的人.再者,被动和别人同住(学校.厂里宿舍.公司宿舍).公共场合时使用,效果刚刚的.题外话:有些人的素质……%¥%(*¥*! 3M隔音耳罩平时戴着也没觉得 ...