直接赋题目。。。。。

 

题目描述

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

1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。

2 .在满足条件1 的情况下使路径最短。

注意:图G 中可能存在重边和自环,题目保证终点没有出边。

请你输出符合条件的路径的长度。

输入输出格式

输入格式:

输入文件名为road .in。

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

接下来的m 行每行2 个整数x 、y ,之间用一个空格隔开,表示有一条边从点x 指向点y 。

最后一行有两个用一个空格隔开的整数s 、t ,表示起点为s ,终点为t 。

输出格式:

输出文件名为road .out 。

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

对于一般的这种没有权值的有向图,一般都会想到跑一边bfs,用一个数组记录花费比如我)。

然而这道题的不同之处在于

1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。

如图 按照题目中所述

    2可以到达T,3也可以到达T,但是选择路径时可以选择3,不能选择2。

    原因在于2有一个子节点为1,而1不能到达T,所以不能选择2。

清楚了这个之后,思路基本上就有了(因为我太弱,思路可能不太完美)

  1. 首先,存图时,存一个反图,便于后边从t开始的bfs
  2. 从t开始bfs一次,找出所有能到达t的点
  3. 讲不能到达t的父节点和此节点标记为不能走
  4. 最后,从s开始bfs一次,只走能走的点,并用一个数组记录路径长

最后附上代码

 #include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
queue<int>q1,q2;
struct node{
int u,v,nxt;
}a[],b[];
int n,m,head1[],head2[],vis1[],s,t,vis2[],vis3[];
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;++i)
{
scanf("%d%d",&x,&y);
if(x!=y)
{
a[i].u=x,a[i].v=y,a[i].nxt=head1[x];//用a来存正向图
head1[x]=i;
b[i].u=y,b[i].v=x,b[i].nxt=head2[y];//b用来存反向图
head2[y]=i;
} }
scanf("%d%d",&s,&t);
q2.push(t);
vis2[t]=;
while(!q2.empty())//从t开始一遍bfs,用vis2记录所有能到达t的点(因为是反图嘛)
{
int qq=q2.front();
q2.pop();
for(int i=head2[qq];i;i=b[i].nxt)
{
int v=b[i].v;
if(!vis2[v])
{
vis2[v]=;
q2.push(v);
}
} }
for(int i=;i<=n;++i)
{
vis3[i]=;
}
for(int i=;i<=m;++i)//将不能到达的节点及其父节点变为不能到达,
{
if(!vis2[a[i].v]) vis3[a[i].u]=vis3[a[i].v]=;//用vis3记录(不用vis2是为了防止后效性,即前面的赋值影响后面,导致vis2全变为0)
}
q1.push(s);
vis1[s]=;
while(!q1.empty())//从s开始一遍bfs,
{
int qq=q1.front();
q1.pop();
for(int i=head1[qq];i;i=a[i].nxt)
{
int v=a[i].v;
if(v==t)//搜到了t就将其路径长输出
{
printf("%d",vis1[a[i].u]);//因为vis[3]初值为1,所以此处不用+1;
return ;
}
else if(vis3[v]&&!vis1[v])//只走vis3中标记为能走的点(前边一大堆就是为了找这些点....)
{
       vis1[v]=vis1[a[i].u]+;//将每个节点的路径长变为其父节点 路径长+1,因为权值都是1,这也是能用bfs而可以不用dijkstra的原因
q1.push(v);
}
}
}
printf("-1");//如果不能到达就输出-1
return ;//拜拜。。。。
}

[luogu2296][寻找道路]的更多相关文章

  1. $Noip2014/Luogu2296$ 寻找道路 图论

    $Luogu$ $Sol$ 首先找出符合条件一的点然后跑$SPFA$就好了叭. 如何判断点是否符合条件一呢?先连反边,记录每个点的入度,然后从终点开始$dfs$,记录每个点被到达的次数,若到达的次数等 ...

  2. 【NOIP14 D2T2】寻找道路

    Source and Judge NOIP2014 提高组 D2T2Luogu2296Caioj1567 Problem [Description] 在有向图 G 中,每条边的长度均为 1,现给定起点 ...

  3. NOIP2014 寻找道路

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

  4. Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组

    3731 寻找道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找 ...

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

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

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

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

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

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

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

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

  9. noip寻找道路

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

随机推荐

  1. Spirng boot maven多模块打包不踩坑

    本文参考 https://blog.csdn.net/Ser_Bad/article/details/78433340 经过实战一次通过.回话不多说,话费不多说,直接上图. 项目整体结构: 父模块: ...

  2. spring-01

    Spring概述 概述 Spring是一个开源框架 为企业级开发而生 是一个IOC[DI]和AOP容器框架 有许多优良特性 非侵入式:基于Spring开发的应用中的对象可以不依赖Spring的API. ...

  3. python之路--类的约束, 异常处理, MD5, 日志处理

    一 . 类的约束 1. 写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束. 必须重写该方法 # 以后上班了. 拿到公司代 ...

  4. Netcat实用操作

    写久了web倦了,第n次开始尝试网络开发,于是熟悉一下常用工具. 尝试了一下netcat来测试服务器,或者充当客户端都异常好用.于是记录一下常用的一下命令 1. 充当服务器,或者客户端进行访问 通过n ...

  5. Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法

    1.为什么会报错 ? 这里抱着错误是因为 babel 的版本冲突. 多是因为你的 babel 依赖包不兼容. 可以查看你的 package.json 的依赖列表 即有 babel 7.0 版本的( @ ...

  6. vue实例相关2

    vue data中 对象/数组 不为空,即使定义为[]/{} new Vue({ el: '#main', data: { list: [], current: {}, aa:'' } }) cons ...

  7. 19JDBC初体验

    一.JDBC常用类和接口 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为 ...

  8. zabbix自动注册

    实现方法是: 第一: 选择动作-->事件源-->自动注册-->创建动作 第二: 动作-->触发条件-->主机元数据-->contains-->Linux 第四 ...

  9. Codeforces Round #446 Div. 1

    B:即使看到n<=22也应该猜到这只是为了写spj.将每个数替换为恰好比他大的数即可,最大值替换为最小值.这样原序列中不包含最小值的集合显然都满足条件,并且容易发现包含最小值的集合的变化量都是最 ...

  10. 洛谷P2722总分题解

    题目 这个题是一个裸的完全背包问题,但是数组需要开大, 代码 #include<iostream> using namespace std; int n,m,v,i; int c[1000 ...