每日一题 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 寻找道路 题解的更多相关文章

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

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

  2. 洛谷——P2296 寻找道路

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

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

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

  4. 『题解』洛谷P2296 寻找道路

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...

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

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

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

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

  7. 洛谷 [P2296] 寻找道路

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

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

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

  9. 洛谷P2296寻找道路

    传送门啦 题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通. 所以我们要先判断能否走这一个点, $ bfs $ 类似 $ spfa $ 的一个判断,打上标记. 在这我反向建图,最 ...

随机推荐

  1. 关于fastjson与jackson在反序列化bool型时的区别

    背景 在测试中,两个项目a,b的接口参数用到了Bool类型,当传参"0",项目a通过了,项目b报错了,排查了下,项目b的那个接口,在对传参反序列化时就出现了问题,最后发现两个项目使 ...

  2. Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂

    在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...

  3. Oracle——无法在查询中执行 DML 操作

    今天在调用Oracle Function遇到一个异常

  4. 记录用到的mssql的几个方法

    1.RIGHT ( character_expression , integer_expression ) 返回字符串中从右边开始指定个数的字符 character_expression 字符或二进制 ...

  5. [C#] 生成中文电子通讯录

    var template = @" BEGIN:VCARD VERSION:2.1 N;CHARSET=gb2312:;{0};;; FN;CHARSET=gb2312:{0} TEL;CE ...

  6. Linux中etc目录详解大全总汇详解

    /etc etc不是什么缩写,是and so on的意思 来源于 法语的 et cetera 翻译成中文就是 等等 的意思. 至于为什么在/etc下面存放配置文件, 按照原始的UNIX的说法(Linu ...

  7. SQL*Plus 与数据库的交互(SQL*Plus时什么)

    Oracle 的 SQL*Plus 是与数据库进行交互的客户端工具,在 SQL*Plus中,可以运行 SQL*Plus 命令与 SQL*Plus 语句.   SQL*Plus 时一个基于 C/S 两层 ...

  8. RabbitMQ实战场景(一):异步记录用户操作日志

    传统的项目开发中业务流程以串行方式,执行了模块1—>模块2–>模块3 而我们知道,这个执行流程其实对于整个程序来讲是有一定的弊端的,主要有几点: (1)整个流程的执行响应等待时间比较长; ...

  9. git 出现 fatal: remote origin already exists 错误

    当输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 出现 如下错误: 解决办法如下: 1.先输入 ...

  10. FreeRTOS队列操作

    API函数 //创建 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xQueueCreate( uxQueueLength, uxItemS ...