洛谷 P2296 寻找道路 题解
每日一题 day42 打卡
Analysis
首先,预处理,把每条边反向。
从终点开始bfs,标记从终点开始可以走到的点。
第二步,枚举每一个点,如果这个点没有被标记,则枚举它的每一条出边(反向后的),如果它指向的点被标记,则说明这个被标记的点不合法,删除。
第三步,在合法点上bfs,单源最短路。找到答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define int long long
#define maxm 200000+10
#define maxn 10000+10
#define xb return
#define xh 0
#define sty ;
#define rep(i,s,e) for(register int i=s;i<=e;++i)
#define dwn(i,s,e) for(register int i=s;i>=e;--i)
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n,m,cnt1,cnt2,s,t;
int head1[maxm],head2[maxm];
bool book[maxn],book1[maxn],mark[maxn];
struct node1
{
int v,nex;
}edge1[maxm];
struct node2
{
int v,nex;
}edge2[maxm];
inline void add1(int x,int y)
{
edge1[++cnt1].v=y;
edge1[cnt1].nex=head1[x];
head1[x]=cnt1;
}
inline void add2(int x,int y)
{
edge2[++cnt2].v=y;
edge2[cnt2].nex=head2[x];
head2[x]=cnt2;
}
void bfs_back(int start)
{
queue<int> q;
q.push(start);
book[start]=;
while(!q.empty())
{
int from=q.front();
q.pop();
for(int i=head2[from];i;i=edge2[i].nex)
{
int to=edge2[i].v;
if(book[to]==) continue;
book[to]=;
q.push(to);
}
}
}
int bfs_top(int start)
{
queue<pair<int,int> > q;
q.push(make_pair(start,));
mark[start]=;
int flag=;
while(!q.empty())
{
int from=q.front().first,val=q.front().second;
q.pop();
if(from==t)
{
flag=;
return val;
}
for(int i=head1[from];i;i=edge1[i].nex)
{
int to=edge1[i].v;
if(mark[to]==||book1[to]==) continue;
mark[to]=;
q.push(make_pair(to,val+));
}
}
if(flag==) return -;
}
signed main()
{
n=read();m=read();
rep(i,,m)
{
int x=read(),y=read();
add1(x,y);
add2(y,x);
}
s=read();t=read();
bfs_back(t);
if(book[s]==)
{
write(-);
xb xh sty
}
rep(i,,n)
if(book[i]==)
{
book1[i]=;
int from=i;
for(int j=head1[from];j;j=edge1[j].nex)
{
int to=edge1[j].v;
if(book[to]==)
{
book1[from]=;
break;
}
}
}
if(book1[s]==)
{
write(-);
xb xh sty
}
int ans=bfs_top(s);
write(ans);
xb xh sty
}
请各位大佬斧正(反正我不认识斧正是什么意思)
洛谷 P2296 寻找道路 题解的更多相关文章
- 洛谷P2296 寻找道路==codevs3731 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷——P2296 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 『题解』洛谷P2296 寻找道路
更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...
- [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 赋值的地方很容易错,千万别反复赋值: 一道水题写了 ...
- 洛谷P2296寻找道路
传送门啦 题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通. 所以我们要先判断能否走这一个点, $ bfs $ 类似 $ spfa $ 的一个判断,打上标记. 在这我反向建图,最 ...
随机推荐
- Asp.Net Core异常处理
本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...
- InfoGan笔记
InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets ...
- 运行时找到main方法所在的类
private Class<?> deduceMainApplicationClass() { try { StackTraceElement[] stackTrace = new Run ...
- 【转】使用Dockerfile构建镜像并push到私有仓库
环境:OS X 10.10.5 maven 3.3.9 Docker version 1.12.2 docker-machine version 0.8.2 程序示例为http://www.cnblo ...
- OpenJML入门
目录 OpenJML 获取 下载 使用 Linux Windows Parsing and Type-checking Extended Static Checking Runtime Asserti ...
- iOS-右滑返回,利用Runtime添加全屏Pop手势
项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能. 在我们不隐藏 NavigationBar 的前提下,系统会自动替我增加此功能,只是它作用的范围仅仅在屏幕左边有限区域. 我们需要在整个界 ...
- Mongodb 学习笔记(一)
MongoDB 是一款开源.跨平台.分布式,具有大数据处理能力的文档存储数据库.在 2007 年由 MongoDB 软件公司开发完成,并实现全部代码源发展.目 前,该文档数据库被国内外众多知名网因所采 ...
- angular异步获取数据后在ngOnInit中无法获取,显示undefined解决办法
两种方法 1 通过*ngif动态加载要数据渲染的dom 2 通过路由导航resolve 第一种感觉太麻烦了,要是一个页面请求多个接口,那就不得不写多个*ngif,本人还是更倾向与第二种发法 具体步骤: ...
- 【雅思】【绿宝书错词本】List37~48
List 37 ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ List 38 ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤ List 39 ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ...
- JAVA - Windows下JDK默认安装的配置参数
JDK版本1.8 JAVA_HOME C:\Program Files\Java\jdk1.8.0_60 CLASSPATH .;%%JAVA_HOME%%\lib;%%JAVA_HOME%%\lib ...