某个地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,且有公路的并不都能双向行驶。现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇。(我们规定,城镇自己跟自己可互相到达,即A可到达A).
两种搜索都可以做,时间复杂度也差不多,至于难度,水题;
DFS;
#include<string.h>
#include<stdio.h>
int map[2100][2100];
int use[2100];
int n,m,a,b,flag;
int len[2100];
void DFS(int x)
{
if(x==b)
{
flag=1;
return ;
}
if(flag)
return;
for(int i=0;i<len[x];i++)
{
if(!use[map[x][i]])
{
use[map[x][i]]=1;
DFS(map[x][i]);
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(len,0,sizeof(len));
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)
{
scanf("%d",&m);
int a1,b1;
scanf("%d",&a1);
for(int j=0;j<m-2;j++)
scanf("%d",&map[a1][j]);
len[a1]=m-2;
}
while(n--)
{
memset(use,0,sizeof(use));
flag=0;
scanf("%d%d",&a,&b);
use[a]=1;
DFS(a);
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
BFS:
#include<string.h>
#include<stdio.h>
#include<queue>
using namespace std;
queue<int> que;
int map[2100][2100];
int use[2100];
int n,m,a,b,flag;
int len[2100];
void BFS()
{
while(!que.empty())
{
int dx=que.front();
que.pop();
if(dx==b)
{
flag=1;
return;
}
for(int i=0;i<len[dx];i++)
{
if(!use[map[dx][i]])
{
use[map[dx][i]]=1;
que.push(map[dx][i]);
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(len,0,sizeof(len));
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)
{
scanf("%d",&m);
int a1,b1;
scanf("%d",&a1);
for(int j=0;j<m-2;j++)
scanf("%d",&map[a1][j]);
len[a1]=m-2;
}
while(n--)
{
while(!que.empty())
que.pop();
memset(use,0,sizeof(use));
flag=0;
scanf("%d%d",&a,&b);
use[a]=1;
que.push(a);
BFS();
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}