noip寻找道路
题目描述
在有向图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 。
输入输出样例
3 2
1 2
2 1
1 3
-1
6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5
3
说明
解释1:

如上图所示,箭头表示有向道路,圆点表示城市。起点1 与终点3 不连通,所以满足题
目᧿述的路径不存在,故输出- 1 。
解释2:

如上图所示,满足条件的路径为1 - >3- >4- >5。注意点2 不能在答案路径中,因为点2连了一条边到点6 ,而点6 不与终点5 连通。
对于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。
【解析】
跑两边bfs。
因为要求从走的这个点相连的点能到达终点,那么也能从终点走到那个点。
所以我们在存边的时候顺便存一个反图。就是原来的道路的方向都是反的。
那样我们从终点开始bfs,能够进入队列中的点都标上标记,表示在反图终点可以到达,那么在正图中,这些点也可以到达终点。
但是还有一个条件,与能到达终点的点相连的点也必须能到达终点。
这样。我们从起点开始,如果扫到的这个点是在之前bfs中做过标记的,说明这个点可以到达终点。我们再扫一下和这个点相连的点是否能到达终点,
如果存在一个点不能到达终点,这么当前这个做了标记的点不能走了。
之前的两个处理,我们已经把能走的点做好了标记,那么我们从起点开始一边bfs,记录路径长度选择最优就可以了。
【代码】
//寻找道路
#<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define N 10009
typedef pair<int,int> pii;
vector<int>zmap[N],fmap[N];
queue<int>que;
queue<pair<int,int> >quue;
bool can[N],Go[N],done[N];
int n,m,x,y,st,ed,flag;
void bfs(int x)
{
que.push(x);
can[x]=;
while(que.size())
{
int qq=que.front();
for(int i=;i<fmap[qq].size();i++)
{
int k=fmap[qq][i];
if(!can[k])
{
can[k]=;
que.push(k);
}
}
que.pop();
}
}
void slove()
{
for(int i=;i<=n;i++)
{
flag=;
if(!can[i])continue;
for(int j=;j<zmap[i].size();j++)
{
int k=zmap[i][j];
if(!can[k])
{
flag=;break;
}
}
if(flag)continue;
else
Go[i]=;
}
}
void bfs1()
{
quue.push(make_pair(st,));//
while(quue.size())
{
pii x=quue.front();
for(int i=;i<zmap[x.first].size();i++)
{
int t=zmap[x.first][i];
if(t==ed)
{
printf("%d",x.second+);
}
if(Go[t]&&!done[t])
{
done[t]=;
quue.push(make_pair(t,x.second+));
}
}
quue.pop();
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
zmap[x].push_back(y);
fmap[y].push_back(x);
}
scanf("%d%d",&st,&ed);
bfs(ed);
slove();
if(!Go[st])
{
cout<<-;
return ;
}
bfs1();
return ;
}
noip寻找道路的更多相关文章
- Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组
		
3731 寻找道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找 ...
 - NOIP2014 寻找道路
		
2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指 ...
 - 洛谷P2296 寻找道路 [拓扑排序,最短路]
		
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
 - 【DFS】【图论】NOIP2014寻找道路
		
[NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所 ...
 - 【洛谷P2296】[NOIP2014]寻找道路
		
寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...
 - 洛谷P2296 寻找道路==codevs3731 寻找道路
		
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
 - 洛谷——P2296 寻找道路
		
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
 - luogu 2296  寻找道路 (搜索)
		
luogu 2296 寻找道路 题目链接:https://www.luogu.org/problemnew/show/P2296 从终点bfs或者dfs,找出所有终点能到达的点. 然后再从1到n看一下 ...
 - 最短路 || UOJ 19 寻找道路
		
UOJ j19 寻找道路 在有向图G中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的最短路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. * ...
 
随机推荐
- EasyDSS视频点播服务器实现的多码率点播功能的说明
			
EasyDSS流媒体音视频直播与点播服务器软件,是一套提供一站式的转码.点播.直播.检索.回放.录像下载服务的高性能RTMP/HLS/HTTP-FLV流媒体服务,极大地简化了流媒体相关业务的开发和集成 ...
 - 九度OJ 1345:XXX定律之画X (递归)
			
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:361 解决:157 题目描述: 给你一个n,然后让你输出F(n) 规则是这样的,F(n)的输出结果是: F(n-1) F(n-1) ...
 - 20179209《Linux内核原理与分析》安全类实验答疑
			
实验一 题目 Nmap 配合 Metasploit 进行端口扫描 问题 Nmap怎么配合Metasploit进行端口扫描? 回答 这里的Nmap配合Metasploit进行端口扫描是指在Metaspl ...
 - Activiti使用过程_1
			
1 微信公众号:
 - python 局部local和全局global变量
			
global和local变量 虽然简单,但是还是记录一下,主要是转载 转载自:http://blog.sina.com.cn/s/blog_436992740102ux8z.html 先看一段代码 ...
 - Vue-cli创建项目从单页面到多页面4 - 本地开发服务器设置代理
			
前后端分离开发时,有时候会遇到跨域的情况:只在开发的时候存在跨域,项目上线后,由于配置的域名相同,跨域就会不存在. 这个时候,有两种方案可以比较快的解决: 1.利用h5的特性,使用cors,在ngni ...
 - c的详细学习(2)数据类型,运算符与表达式
			
本节用来介绍c语言中的数据类型和运算符. (1)c语言的基本符号: 任何一种基本语言都有自己的基本词汇表.c语言的基本词汇表有一下几部分: *数字10个: *英文字母:大小 ...
 - 【leetcode刷题笔记】Valid Number
			
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
 - 【三】MongoDB文档的CURD操作
			
一.插入文档 使用insert方法插入文档到一个集合中,如果集合不存在创建集合,有以下几种方法: db.collection.insertOne({}):(v3.2 new) #插入一个文档到集合中 ...
 - Spark Structured Streaming框架(5)之进程管理
			
Structured Streaming提供一些API来管理Streaming对象.用户可以通过这些API来手动管理已经启动的Streaming,保证在系统中的Streaming有序执行. 1. St ...