洛谷P2296寻找道路
传送门啦
题目中有一个条件是路径上的所有点的出边所指向的点都直接或间接与终点连通。
所以我们要先判断能否走这一个点, $ 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寻找道路的更多相关文章
- 洛谷P2296 寻找道路==codevs3731 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷——P2296 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 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】
反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...
- 洛谷P2296 寻找道路_简单BFS
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...
随机推荐
- 前端学习 -- Css -- 伪类
伪类和伪元素用来表示元素所处的一个特殊的状态,或者是一个特殊的位置 比如:访问过的超链接,比如普通的超链接,比如获取焦点的文本框当我们需要为处在这些特殊状态的元素设置样式时,就可以使用伪类 为没访问过 ...
- 洛谷P4382 劈配
不知道这个Zayid是谁... 题意: 有n个人,m个导师.每个导师能接纳bi个人,每个人对于这m个导师都有一个志愿档次. 优先满足靠前的人,问到最后每个人匹配的导师是他的第几志愿. 每个人又有一个限 ...
- pg数据库杀掉连接
遇到异常连接时,需要将对应连接杀掉,可能是连接占用了过多CPU或是IO,影响了业务,或是时间过长的空闲事务. pg对于杀掉连接提供了专门的命令,一般情况下使用pg_cancel_backend就可以, ...
- 得到不知道维度的string数组的维度
在项目中常用到一类数组,那就是不知道个数的数组,例如: string ParamTable[] = {"frequency","ifbw","span ...
- NATS_02:NATS消息通信模型
消息通信模型 NATS的消息通信是这样的:应用程序的数据被编码为一条消息,并通过发布者发送出去:订阅者接收到消息,进行解码,再处理.订阅者处理NATS消息可以是同步的或异步的. * 异步处理 异步处 ...
- JS获取当前时间并格式化"yyyy-MM-dd HH:mm:ss"
先来看下JS中的日期操作: var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年 ...
- css选择器 nth-child
html代码: <div> <p>多云转晴</p> <p>多云转晴</p> <p>多云转晴</p> <p> ...
- 2017 清北济南考前刷题Day 7 afternoon
期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...
- java selenium常用API(WebElement、iFrame、select、alert、浏览器窗口、事件、js) 一
WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.clic ...
- 织梦dedecms 模板文件不存在,无法解析文档!
方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives.class.php 556行 if (!preg_match("# ...