每日一题 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. argv和raw_input的区别

    argv是在一开始就要输入不输入程序会出现错误,raw_input是在运行之后进行输入.

  2. Scala 条件控制与循环

    Scala if表达式 ·if表达式的定义:在Scala中,if表达式是有值的,就是if或者else中最后一行语句返回的值. ·例如,val age = 30; if (age > 18) 1 ...

  3. 字符串类型日期时间转换为Date类型解析转换异常java.text.ParseException: Unparseable date: “2019-09-27T18:31:31+08:00”

    错误的写法: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //这里的格式也可以是别 ...

  4. LOJ3119 CTS2019 随机立方体 概率、容斥、二项式反演

    传送门 为了方便我们设\(N\)是\(N,M,L\)中的最小值,某一个位置\((x,y,z)\)所控制的位置为集合\(\{(a,b,c) \mid a = x \text{或} b = y \text ...

  5. Redis之RDB和AOF持久化介绍

    什么是数据库状态 redis是一个键值对的数据库服务器,服务器中通常包含中任意个非空的数据库,而每个数据库又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及他们的键值对统称为数据库状 ...

  6. 【转载】C#中Add方法将往List集合末尾添加相应元素对象

    在C#的List集合操作中,有时候需要将符合条件的对象添加到已有List集合中的末尾,此时就需要使用到List集合的Add方法,Add方法的作用为将对应的元素添加到List集合末尾,Add方法签名为v ...

  7. 【转载】Extjs设置Ajax请求的超时时间timeout

    在Extjs中的Ajax请求中,Ext.Ajax.request 默认超时时间是30秒,有时候我们有比较耗时的操作需要设置更长时间,此时我们就需要修改Ext.Ajax.Requset的超时时间为更长, ...

  8. vue 解决ios编辑器输入框不能拉起

    一.问题描述:Android .pc.下可以正常使用,在ios下可以拉起输入框但是无法输入 <div contenteditable="true" ></div& ...

  9. 如何在vue项目中引入element-ui

    安装 elementUI npm install element-ui --save 引入elementUI import ElementUI from 'element-ui' import 'el ...

  10. DCL 管理权限

    一个数据库里面有着多个用户,每个用户的权限也不仅相同. 一.查询权限 1.基本语法格式: show grants for '用户名'@'主机名';  2.具体操作 查看 user1 用户的权限 注意: ...