题目:

描述

某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶。现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇。(我们规定,城镇自己跟自己可互相到达,即 a 可到达 a)。

输入

第一行只有一个数 N ,下面将跟着 2N 行数据。

在前 N 行数据中,每行数据开头第一个数字 number,表明这一行总共有 number个数, number的下一个数为 i ,代表编号为 i 的城镇。这行余下的就是跟 i 有公路连接的城镇名单,并且只能从城镇 i 驶向其他城镇。如 4 1 2 3,表明:此行有 4 个数,跟城镇 1 有公路连接的城镇是编号为 2 和 3 的城镇,且只允许从城镇 1驶向城镇 2 和 3 ,而不能从 2 到 1 或 3 到 1。

在后 N 行数据中,每行由两个数字组成 a , b。

对于每个输入的数有如下关系 0≤input_number≤1000。

输出

对于输入数据中的每个 a,b,判断是否可以从城镇 a 通过公路到达城镇 b,如果可以,输出 Yes;否则输出No。

输入样例 1

3
4 1 2 3
3 4 5
3 5 8
1 2
1 8
4 8

输出样例 1

Yes
No
Yes 这是一道经典的搜索题,用BFS或DFS都行,因为博主DFS打的已经很熟了,准备挑战一下自己,所以我就来讲讲BFS的做法。

如图,因为是单向公路,所以尽管所有点都连得到点2,但点2却一个点都走不到,所以这是一个有向图。

首先,让我们来定义一波:
int n;
queue<int>q;
vector<int>g[];

这里也就不需要讲了吧,bfs必备的vector和queue的定义也就这样。


接下来,我们把输入输出解决了,这个输入特别怪异。输入n有2n行,前n行会首先输入一个number,代表这一行加上它共有number个数;后n行每行2个数,是询问,问a和b书否连通。

    cin>>n;
for (int i=;i<=n;i++){
int tmp1,tmp2;
cin>>tmp1>>tmp2;
for (int j=;j<tmp1-;j++){
int x;
cin>>x;
g[tmp2].push_back(x);
} }

然后进行输出,如果bool类型的bfs值是true或a和b相等,就输出Yes,否则输出No。

    for (int i=;i<=n;i++){
int a,b;
cin>>a>>b;
if(bfs(a,b)==true||a==b){
cout<<"Yes"<<endl;
}
else {
cout<<"No"<<endl;
}
}

最后,开始我们的BFS!

首先,把起点push到队列里。

bool bfs(int start,int end){
q.push(start);
}

然后开始BFS套路:while (!q.empty())

接下来,将目前的位置取出来(now),再弹出队列。

最后,遍历g[now],如果到达了end,就返回ture,否则就将找到的点放在队列里。如果队列都已经清空了,那就只有遗憾地告诉你,没有找到。只有输出No了。

整个BFS:

bool bfs(int start,int end){

    q.push(start);
while (!q.empty()){
int now=q.front();
q.pop();
for (int i=;i<g[now].size();i++){
if(g[now][i]==end){
return true;
}
q.push(g[now][i]);
}
}
return false;
}

完整代码:

#include <bits/stdc++.h>
using namespace std;
int n,vis[];
queue<int>q;
vector<int>g[]; bool bfs(int start,int end){ q.push(start);
while (!q.empty()){
int now=q.front();
q.pop();
for (int i=;i<g[now].size();i++){
if(g[now][i]==end){
return true;
}
q.push(g[now][i]);
}
}
return false;
} int main(){
cin>>n;
for (int i=;i<=n;i++){
int tmp1,tmp2;
cin>>tmp1>>tmp2;
for (int j=;j<tmp1-;j++){
int x;
cin>>x;
g[tmp2].push_back(x);
} }
for (int i=;i<=n;i++){
int a,b;
cin>>a>>b;
if(bfs(a,b)==true||a==b){
cout<<"Yes"<<endl;
}
else {
cout<<"No"<<endl;
}
}
return ;
}

最后,Accept送给大家!

YCOJ单向公路的更多相关文章

  1. [Swust OJ 85]--单向公路(BFS)

    题目链接:http://acm.swust.edu.cn/problem/0085/ Time limit(ms): 5000 Memory limit(kb): 65535   Descriptio ...

  2. 1107: 单向公路(bfs+输入整理)(DFS也可以,而且更快)

    Description 某个地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,且有公路的并不都能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一 ...

  3. 【bfs】单向公路-C++

    描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇 ...

  4. C#算法知识点记录

    针对算法的知识点进行记录 简易桶排序 首先看一个简易桶排序,有一串数字,进行从大到小排列.数字间隔不大,使用一维数组来当作桶,进行插入排序. static void Main(string[] arg ...

  5. 【Noip模拟 20161005】友好城市

    问题描述 小ww生活在美丽的ZZ国.ZZ国是一个有nn个城市的大国,城市之间有mm条单向公路(连 接城市ii.jj的公路只能从ii连到jj).城市ii.jj是友好城市当且仅当从城市ii能到达城市jj并 ...

  6. tarjan强连通分量模板(pascal)

    友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...

  7. Python 多线程和单线程本质应用区别

    先了解下CPU的简单运行原理: 它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务:但是可以将多个任务交替执行,比如上一个时间片段 ...

  8. 【bfs基础】①

    bfs,即广度优先搜索,主要通过队列(queue)进行操作. 稍微解释一下,队列是一种基础数据结构,其形态类似于一支长长的队伍,大概如下: 在C++中,队列的头文件定义为:#include<qu ...

  9. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

    题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...

随机推荐

  1. [ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25274   Accepted: 8131 Des ...

  2. wyh2000 and pupil

    wyh2000 and pupil  Accepts: 93  Submissions: 925  Time Limit: 3000/1500 MS (Java/Others)  Memory Lim ...

  3. CPU Stepping

    http://baike.baidu.com/view/16839.htm?fr=ala0_1_1 步进 编辑   步进(Stepping)是CPU的一个重要参数,也叫分级鉴别产品数据转换规范,“步进 ...

  4. Linux 用户和文件权限管理

    Linux —— 用户权限管理 权限: 为什么需要权限管理?    1.计算机资源有限,我们需要合理的分配计算机资源.    2.Linux是一个多用户系统,对于每一个用户来说,个人隐私的保护是十分重 ...

  5. TestNG – Dependency Test

    转自:http://www.mkyong.com/unittest/testng-tutorial-7-dependency-test/ In TestNG, we use dependOnMetho ...

  6. (转载)display:inline、block、inline-block的区别

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

  7. BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)

    3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...

  8. Android 返回键的处理

    多网友不明确怎样在Android平台上捕获Back键的事件.Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台.而回到桌面的尴尬情况,在Android上有两种方法来获取该 ...

  9. Safair css hack

    一下方式不会影响chrome浏览器样式 _::-webkit-full-page-media, _:future, :root .class{ /*此处放css样式*/ }

  10. 微信小程序 navigateTo 传对象参数

    当微信小程序navigateTo传入参数是个object时,请使用JSON.strtingify将object转化为字符串,代码如下: wx.navigateTo({ url: '../sendChe ...