NC16498 [NOIP2014]寻找道路
题目
题目描述
在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:
1.路径上的所有点的出边所指向的点都直接或间接与终点连通。
2.在满足条件1的情况下使路径最短。
注意:图G中可能存在重边和自环,题目保证终点没有出边。
请你输出符合条件的路径的长度。
输入描述
第一行有两个用一个空格隔开的整数n和m,表示图有n个点和m条边。
接下来的m行每行2个整数x、y,之间用一个空格隔开,表示有一条边从点x指向点y。
最后一行有两个用一个空格隔开的整数s、t,表示起点为s,终点为t。
输出描述
输出只有一行,包含一个整数,表示满足题目描述的最短路径的长度。如果这样的路径不存在,输出-1。
示例1
输入
3 2
1 2
2 1
1 3
输出
-1
说明
如上图所示,箭头表示有向道路,圆点表示城市。起点1与终点3不连通,所以满足题目描述的路径不存在,故输出-1。
示例2
输入
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5
输出
3
说明
如上图所示,满足条件的路径为1->3->4->5。注意点2不能在答案路径中,因为点2连了一条边到点6,而点6不与终点5连通。
备注
对于30%的数据,0< n≤10,0< m≤20;
对于60%的数据,0< n≤100,0< m≤2000;
对于100%的数据,0< n≤10,000,0< m≤200,000,0< x,y,s,t≤n,x≠t。
题解
知识点:BFS,图论。
显然用bfs,但与普通走迷宫不同的是,迷宫路径上的点的任意邻接点都必须也能通往终点,这意味着最短路径并非合法路径。
首先筛选出哪些点能通往终点,选择反向建图,从终点出发走迷宫走到的点都是可达终点的点,用 \(ck1[i]\) 表示编号 \(i\) 的点可以到达终点。
然后遍历每个点,如果是不可行点,将其在反向图意义下的邻接点全都排除。因为图是反向的我们无法找到正向图意义下的邻接点,从而无法从一个可达点找其邻接点是否不可达,因此反过来,把不可达点的反向邻接点都排除即可,因为不可达点是反向邻接点的正向邻接点。用 \(ck2[i]\) 表达这个点是否是满足条件的点。
随后在 \(ck2\) 的限制下遍历图找最短路即可。
时间复杂度 \(O(n+m)\)
空间复杂度 \(O(n+m)\)
代码
#include <bits/stdc++.h>
using namespace std;
vector<int> g[10007];
bool ck1[10007], ck2[10007];
int step[10007];
void bfsck(int st) {
queue<int> q;
q.push(st);
ck1[st] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = 0;i < g[cur].size();i++) {
int now = g[cur][i];
if (ck1[now]) continue;
ck1[now] = 1;
q.push(now);
}
}
}
int bfs(int st, int ed) {
queue<int> q;
q.push(st);
step[st] = 0;
ck2[st] = 0;
while (!q.empty()) {
int cur = q.front();
q.pop();
if (cur == ed) return step[ed];
for (int i = 0;i < g[cur].size();i++) {
int now = g[cur][i];
if (!ck2[now]) continue;
ck2[now] = 0;
step[now] = step[cur] + 1;
q.push(now);
}
}
return -1;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1;i <= m;i++) {
int u, v;
cin >> u >> v;
if (u == v) continue;
g[v].push_back(u);
}
int st, ed;
cin >> st >> ed;
bfsck(ed);///找到终点可达点
memcpy(ck2, ck1, sizeof(ck1));///复制出来
for (int u = 1;u <= n;u++) {///进一步筛选所有正向邻接点是终点可达点的终点可达点
///因为通路反向了,不能通过找到终点可达点找到判断其正向邻接点是否是终点不可达点
///而要通过终点不可达点排除其反向邻接点,因为终点不可达点的反向邻接点的正向邻接点是终点不可达点
if (ck1[u]) continue;
for (int j = 0;j < g[u].size();j++)
ck2[g[u][j]] = 0;
}
cout << bfs(ed, st) << '\n';///找到终点到起点的最短路径
return 0;
}
NC16498 [NOIP2014]寻找道路的更多相关文章
- 【DFS】【图论】NOIP2014寻找道路
[NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所 ...
- NOIP2014 寻找道路
2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指 ...
- 【洛谷P2296】[NOIP2014]寻找道路
寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...
- [NOIP2014]寻找道路(图论)
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- 1807. [NOIP2014]寻找道路P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- [洛谷P2296] NOIP2014 寻找道路
问题描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- [NOIP2014]寻找道路 题解
题目大意: 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足 ...
- luogu2296 [NOIp2014]寻找道路 (bfs)
反着建边,从T bfs找合法的点,然后再正着bfs一下求最短路就行了 #include<bits/stdc++.h> #define pa pair<int,int> #def ...
- NOIP2014 day2 t2 寻找道路
寻找道路 NOIP2014 day2 t2 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
随机推荐
- Java之利用openCsv导出csv文件
当时导入的时候用的openCsv,那么导出的时候自然也是用这个,查了好多资料才找到解决方案,下面记录一下实现过程. 1.Controller层: /** * 导出csv文件 */ @RequestMa ...
- 【TouchGFX】MIXINS - ClickListener
ClickListener Click Listener混合器使它可以应用到其小部件,并能够通过使用回调扩展小部件来响应触摸输入. 在TouchGFX Designer中,可以通过在" Mi ...
- java - 对象装载数据返回
1. 创建 Phone 类 package class_object; public class Phone { String brand; String color; double price; v ...
- [转帖]jmeter 使用beanshell 编写脚本
目录 一.介绍 1.1 介绍 1.2 下载&启动 二.jmeter中创建beanshell脚本 三.jmeter与beanshell 数据交互 3.1 例子1 beanshell 将变量传给j ...
- [转帖]总结:nginx502:Tomcat调优之acceptCount
问题背景:UI页面点击会偶尔返回error,检查调用日志,发现nginx报502报错,因此本文即排查502报错原因. 如下红框可知,访问本机个备机的服务502了,用时3秒左右(可见并不是超时) 先给出 ...
- 学习: Linux的 date 命令
date 命令非常好用 多用 date --h 还是非常好的 获取 今天是今年的第多少天 最简单的办法 就是 date +%j 以后需要多学习 多利用 linux的帮助才可以呢. Usage: dat ...
- 《Javascript高级程序设计》读书笔记——构造函数与原型
构造函数与原型 构造函数模式 最简单的构造函数: function Person(name, age, job) { this.name = name; this.age = age; this.jo ...
- 【字符串,哈希】【Yandex】Yandex7736
2023.6.30 Problem Link 定义一个串 \(S\) 是好的,当且仅当 \(S\) 可以不断消去相邻两个相同字符直至消空.给定一个长为 \(n\) 的字符串 \(s\),求有多少个有序 ...
- vscode中快速声明数据类型
如何快速声明数据类型 上面这张图 let obj1= reactive({ listArr: [], backArr: [{name:'张三',age:10, info:'本科'}], age: 10 ...
- 【遇到一个神奇的问题】暂未想到原因,http.Post 传入 nil参数正确,但是传输值为 nil 的 *bytes.BytesReader 就 `invalid memory address or nil pointer dereference`
出错的代码如下: func getEab(ctx context.Context, credentialsJSON string, old *externalAccountKeyResp) (*ext ...