1061 单向公路

题目描述


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

输入输出格式


输入描述:


第一行只有一个数N,下面将跟着2N行数据. 
在前N行数据中,对于每行数据,最开头一个数字number,表明这一行总共有number个数,number的下一个数为i,代表编号为i的那个城镇.
这行余下的就是跟i有公路连接的城镇的(编号)名单,且只能从城镇i驶向其他城镇。
如 4 1 2 3,表明:此行有4个数,跟城镇1有公路连接的城镇是编号为2和3的城镇.是从1连到2 和3 ,不能从2 和3 连到1. 
在后N行数据中,每行由两个数字组成a,b(表示城镇的编号).
对于每个输入的数有如下关系 0 <= input_number <= 1000 .

输出描述:


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

输入输出样例


输入样例#:


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


输出样例#:


Yes
No
Yes

代码:

#include<iostream>
#include<cstring>
using namespace std;
bool stat[1001][1001];
bool visited[1001];
void dfs(int a, int b, int n, bool& flag)
{
	visited[a] = true;
	if (stat[a][b]) {
		flag = true;
		return;
	}
	for (int i = 0; i <= n && !flag; i++) {
		if (!visited[i] && stat[a][i]) {
			visited[i] = true;
			dfs(i, b, n, flag);
			visited[i] = false;
		}
	}
}
int main()
{
	int maxn = 0; 
	for (int i = 0; i < 1000; i++) {
		for (int j = 0; j < 1000; j++) {
			if (i == j) {
				stat[i][j] = true;
			}
			else {
				stat[i][j] = false;
			}
		}
	}
	
	int N;
	cin >> N;
	for (int itr = 0; itr < N; itr++) {
		int number;
		cin >> number;
		int i;
		cin >> i;
		maxn = i > maxn ? i : maxn;
		for (int itr2 = 2; itr2 < number; itr2++) {
			int j;
			cin >> j;
			stat[i][j] = true;
			maxn = j > maxn ? j : maxn;
		}
	}
	
	for (int itr = 0; itr < N; itr++) {
		int a, b;
		cin >> a >> b;
		if (a < 0 || b < 0 || a > maxn || b > maxn) {
			cout << "No" << endl;
			continue;
		}
		memset(visited, 0, sizeof(visited));
		bool flag = false;
		dfs(a, b, maxn, flag);
		if (flag) {
			cout << "Yes" << endl;
		}
		else {
			cout << "No" << endl;
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值