首先标记猫可能出现的房间,然后便是简单的深搜。
Also, the mouse can make a walk through two rooms…
本来以为这句话要求米奇经过至少两个不为
起点的房间,但似乎只需一个就够了,也就是说根本不用判断经过房间数。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <vector>
#include <cstdlib>
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
using namespace std;
const int MAX = 100;
int n;
int cat;
int mouse;
bool danger[MAX+2];
vector<int > road[MAX+2];
void read_road()
{
for (int i = 1; i <= MAX; i++)
road[i].clear();
int a, b;
while (scanf("%d%d", &a, &b) && a != -1 && b != -1)
road[a].push_back(b);
}
void cat_dfs(int x)
{
danger[x] = true;
int sz = road[x].size();
for (int i = 0; i < sz; i++)
{
if (!danger[road[x][i]])
cat_dfs(road[x][i]);
}
}
void cat_walk()
{
read_road();
memset(danger, 0, sizeof(danger));
cat_dfs(cat);
}
bool visit[MAX+2];
bool meet;
bool can;
void mouse_dfs(int x)
{
if (danger[x])
{
meet = true;
return;
}
visit[x] = true;
int sz = road[x].size();
for (int i = 0; i < sz; i++)
{
if (road[x][i] == mouse)
can = true;
if(!visit[road[x][i]])
mouse_dfs(road[x][i]);
}
}
void mouse_walk()
{
read_road();
meet = can = false;
memset(visit, 0, sizeof(visit));
mouse_dfs(mouse);
}
int main()
{
int T;
int kase = 0;
scanf("%d", &T);
while (++kase <= T)
{
scanf("%d%d%d", &n, &cat, &mouse);
cat_walk();
mouse_walk();
printf("%c %c\n", (meet) ? 'Y' : 'N', (can) ? 'Y' : 'N');
}
return 0;
}