寻找道路

NOIP2014 day2 t2

描述

在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件:

1.路径上的所有点的出边所指向的点都直接或间接与终点连通。 2.在满足条件 1 的情况下使路径最短。 注意:图 G

中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条件的路径的长度。

输入格式

第一行有两个用一个空格隔开的整数 n 和 m,表示图有 n 个点和 m 条边。 接下来的 m 行每行 2 个整数

x、y,之间用一个空格隔开,表示有一条边从点 x 指向点 y。 最后一行有两个用一个空格隔开的整数 s、t,表示起点为 s,终点为 t。

输出格式

输出只有一行,包含一个整数,表示满足题目᧿述的最短路径的长度。如果这样的路 径不存在,输出-1。

备注

输入样例1

3 2 1 2 2 1 1 3

输出样例1

-1

输入样例2

6 6 1 2 1 3 2 6 2 5 4 5 3 4 1 5

输出样例2

3

数据说明 对于30%的数据,0< n≤10,0< m≤20; 对于60%的数据,0< n≤100,0< m≤2000;

对于100%的数据,0< n ≤10,000,0< m≤ 200,000,0< x,y,s,t≤n,x≠t。

思路:

先建反图 从终点DFS判断能否到达。

再连边从正向BFS搜到终点就可以啦。

// by SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
queue<int>q;
int n,m,from[400500],to[400500],tot=0,vis[20050],s,e,V[20050];
int v[400500],first[20050],next[400050];
void add(int x,int y){v[tot]=y;next[tot]=first[x];first[x]=tot++;}
void dfs(int x){
for(int i=first[x];~i;i=next[i])
if(!vis[v[i]])vis[v[i]]=1,dfs(v[i]);
}
bool check(int x){for(int i=first[x];~i;i=next[i])if(!vis[v[i]])return 1;return 0;}
int main(){
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
for(int i=1;i<=m;i++)
scanf("%d%d",&from[i],&to[i]),add(to[i],from[i]);
scanf("%d%d",&s,&e);
vis[e]=1;dfs(e);
memset(first,-1,sizeof(first));
for(int i=1;i<=m;i++)add(from[i],to[i]);
V[s]=1;q.push(s);
while(!q.empty()){
int t=q.front();q.pop();
if(check(t))continue;
for(int i=first[t];~i;i=next[i]){
if(!V[v[i]])V[v[i]]=V[t]+1,q.push(v[i]);
if(v[i]==e){printf("%d\n",V[t]);return 0;}
}
}
puts("-1");
}

NOIP2014 day2 t2 寻找道路的更多相关文章

  1. 2019.6.5 NOIP2014 day2 t2 寻找道路

    我竟然一个人敲了NOIP提高组的t2? 题目描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直 ...

  2. NOIP2014 day2 T2寻找道路

    #include<iostream> #include<cmath> #include<cstdlib> #include<cstdio> #inclu ...

  3. 【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路

    存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什 ...

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

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

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

    题目:洛谷P2296.Vijos P1909.codevs3731.UOJ#19. 题目大意:给你一张有向图,边权为1,让你找一条s到t的最短路径,但这条路径上所有点的出边所指向的点都与终点连通.如果 ...

  6. [NOIp2014] luogu P2296 寻找道路

    不知道是因为我菜还是别的,最近老是看错题. 题目描述 在有向图 GGG 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向 ...

  7. 【DFS】【图论】NOIP2014寻找道路

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

  8. NOIP2014 寻找道路

    2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指 ...

  9. 【洛谷P2296】[NOIP2014]寻找道路

    寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...

随机推荐

  1. C++版的LLC代码

    图像稀疏编码总结:LLC和SCSPM,文章对稀疏编码讲解非常详细. <Locality-constrained Linear Coding for Image Classification> ...

  2. ubuntu操作系统的目录结构

    /:根目录,是所有目录的绝对路径的起始点.一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中 /bin (类似的还有/usr/bin) ...

  3. javaee字符文件的复制

    package Zy; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWrit ...

  4. python 疑难杂症

    1.getpass模块    :Pycharm不支持getpass模块,使用terminal可运行,但是getpass中文提示显示乱码?

  5. 对 p 开 n 次方 (数学推论)

    #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> us ...

  6. GDI 映射模式(11)

    概述 调用 SetMapMode 函数可以设置映射模式: int SetMapMode( HDC hdc, // 设备环境句柄 int fnMapMode // 要设置的映射模式 ); 同样,调用 G ...

  7. 在oracle中将某个字段的数据作为列名的查询

    原表结构 查询语句: select sno,sname,sum(语文) 语文,sum(数学) 数学,sum(英语) 英语 from (select sno,sname,decode(subjiect, ...

  8. 创建对象—从es5到es6

    原文地址 本文主要讲述了使用JavaScript创建对象的几种方式,分别是传统的Object构造函数.对象字面量.工厂模式.构造函数模式.原型模式.组合模式,以及es6的class定义类.然后从bab ...

  9. 搜索引擎seo优化

    <a href="" title="SEO优化"></a> <img src="" alt="SEO ...

  10. Linux查看 kennel , 物理CPU个数、核数、逻辑CPU个数

    other article on my list: 查看进程 https://i.cnblogs.com/PostDone.aspx?postid=9231604&actiontip=%E4% ...