传送门啦

题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通。

所以我们要先判断能否走这一个点, $ bfs $ 类似 $ spfa $ 的一个判断,打上标记。

在这我反向建图,最后跑最短路的时候就从终点跑到起点,也是一样的。在最短路中加上一个判断就好了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define re register
using namespace std;
const int maxn = 10005;
const int maxm = 200005; inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0' ) { if(ch == '-')f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3 ) + ch - '0';ch = getchar();}
return x * f;
} int n , m , x , y , s , t ;
int head[maxn] , tot ;
bool vis[maxm] , ok[maxm] ; struct Edge{
int from,to,next,val;
}edge[maxm << 1]; struct Node {
int u , d;
bool operator < (const Node &f) const {
return d > f.d;
}
}; inline void add(int u , int v , int w){
edge[++tot].from = u ;
edge[tot].to = v ;
edge[tot].val = w;
edge[tot].next = head[u];
head[u] = tot ;
} inline void bfs(int t){
queue<int> que;
memset(vis , false , sizeof(vis) );
que.push(t);
vis[t] = true;
ok[t] = true;
while( !que.empty() ){
int cur = que.front();
que.pop();
for(re int i = head[cur] ; i ; i = edge[i].next){
int v = edge[i].to ;
if(vis[v] == false){
ok[v] = true ;
vis[v] = true;
que.push(v);
}
}
}
} int dis[maxn];
inline void dijk(int t){
for(re int i = 1 ;i <= n ; ++i) dis[i] = 1e9;
priority_queue<Node> q;
dis[t] = 0;
q.push( (Node) {t , dis[t]});
while( ! q.empty() ){
Node cur = q.top();
q.pop() ;
int d = cur.d , u = cur.u ;
if(d != dis[u]) continue;
for(re int i = head[u] ; i; i = edge[i].next){
int v = edge[i].to;
if(ok[v]) continue;
if(dis[v] > dis[u] + edge[i].val){
dis[v] = dis[u] + edge[i].val;
q.push( (Node) {v , dis[v]} );
}
}
}
} int main(){
n = read(); m = read();
for(re int i = 1 ; i <= m ; ++i) {
x = read(); y = read();
add(y , x , 1);
}
s = read() ; t = read() ;
bfs(t) ;
for(re int i = 1 ; i <= n ; ++i){
vis[i] = ok[i];
}
memset(ok , false , sizeof(ok));
for(int i = 1 ; i <= n ; ++i){
if(!vis[i]) {
for(re int j = head[i] ; j ; j = edge[j].next) {
int v = edge[j].to;
ok[v] = true;
}
}
}
dijk(t) ;
if(dis[s] != 1e9) printf("%d\n",dis[s]);
else printf("-1\n");
return 0;
}

洛谷P2296寻找道路的更多相关文章

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

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

  2. 洛谷——P2296 寻找道路

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

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

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

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

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

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

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

  6. 洛谷 [P2296] 寻找道路

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

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

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

  8. 洛谷 P2296 寻找道路【bfs+spfa】

    反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...

  9. 洛谷P2296 寻找道路_简单BFS

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...

随机推荐

  1. AS可视化布局中文乱码

    求助android studio 的可视化布局中文乱码-CSDN论坛-CSDN.NET-中国最大的IT技术社区http://bbs.csdn.net/topics/391887442 Android ...

  2. Android 通知之 Notification

    Notifications | Android Developershttp://developer.android.com/guide/topics/ui/notifiers/notificatio ...

  3. bzoj 3122 : [Sdoi2013]随机数生成器 BSGS

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

  4. 【bzoj4264】小C找朋友

    题解 $a$和$b$是好*友说明除了这两个人以外的邻接集合相同: 做两次$hash$,分别都处理和$a$相邻的点排序$hash$,①$a$要算进$a$的相邻集合,②$a$不算进: 当两个人不是好*友, ...

  5. 【bzoj4084】【sdoi2015】双旋转字符串

    题解 首先题中说了$n>=m$; 分成的循环串左右两边为本质相同的单循环串循环串,分别长为$l = \frac{n + m}{2} $; 所以$S$串的前$l$位为双循环串的一半$S1$,后一半 ...

  6. Linux crontab 命令格式与举例

    每五分钟执行  */5 * * * * 每小时执行     0 * * * * 每天执行        0 0 * * * 每周执行       0 0 * * 0 每月执行        0 0 1 ...

  7. composer install 出现的问题

    今天克隆代码之后,在composer install 的时候出现了一些问题,在此记录一下. 错误代码如下: [root@localhost MarketingCenter]# composer ins ...

  8. Kubernetes 1.5集成heapster

    Heapster是kubernetes集群监控工具.在1.2的时候,kubernetes的监控需要在node节点上运行cAdvisor作为agent收集本机和容器的资源数据,包括cpu.内存.网络.文 ...

  9. 并发库应用之三 & 线程池与定时器应用

    在TCP服务器编程模型的原理,每一个客户端连接用一个单独的线程为之服务,当与客户端的会话结束时,线程也就结束了,即每来一个客户端连接,服务器端就要创建一个新线程.如果访问服务器的客户端很多,那么服务器 ...

  10. 关于dubbo的架构

    dubbo是国内一个十分受欢迎的分布式rpc框架. 这篇博客是从dubbo官网出发,来说明下dubbo的技术架构.首先我们看下官网的架构图. 节点角色说明: Provider: 暴露服务的服务提供方. ...