图论---是否可达

描述

给出一个有向图,请判断图中某顶点 a 是否可到达另一顶点 b 。

输入描述

多测试用例。每个测试用例如下:

第一行给出该有向图的顶点数 n(1≤n≤1000)。 顶点从 1 开始编号。

第二行给出该有向图的边数 e(0≤e≤200000)。

第三行开始,共 e 行,每行两个正整数 a b,表示从顶点 a 发出一条弧到顶点 b 。

接下来是一个正整数 T,表示有 T 个查询。

接下来 T 行,每行两个整数 u v,表示查询从顶点 u 是否可到达顶点 v 。

输出描述

每个测试用例 T 行结果:对应每个查询,如果从顶点 u 可以到达顶点 v,一行结果:yes,否则:no 。

然后一个空行。

一道简单的oj题,话不多说,上代码:

#include<iostream>
#include<cstring>
using namespace std;
int a[1005][1005];//邻接矩阵 
int b[1005];//判断这个点是不是走过 
int n,m;//顶点数,边数 
void jisuan(int i){
	for(int j=1;j<=n;j++)
		if(b[j]==0&&a[i][j]==1){
			b[j]=1;
			jisuan(j);
		}
}
int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		memset(a,0,sizeof(a));
		int a1,b1;
		for(int i=1;i<=m;i++){
			cin>>a1>>b1;
			a[a1][b1]=1;
		}
		int t,T;
		cin>>T;
		for(t=1;t<=T;t++){
			int a2,b2;
			cin>>a2>>b2;
			memset(b,0,sizeof(b));
			b[a2]=1;
			jisuan(a2);
			if(b[b2]==1)
				cout<<"yes"<<endl;
			else
				cout<<"no"<<endl;
		}
		cout<<endl;
	} 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值