http://acm.pku.edu.cn/JudgeOnline/problem?id=1139

http://acm.pku.edu.cn/JudgeOnline/images/1139/1139_1.jpg

Код:
#include <stdio.h>
int d[128][128];
#define MOUSEDOOR 1
#define CATDOOR   2
int size;	
int mouser;	
int catr;	
int mousecatreachable;	
int r[128];	
void init(int size){
	int i,j;
	for(i = size; i; i--)
	{
for(j = size; j; j--)d[i][j]= 0;
r[i] = 0;
	}
	mousecatreachable=0;
}
void input(int mask){
	int i,j;
	while( scanf("%d %d", &i, &j) != EOF && i != -1)
	{
d[i][j]|= mask;
	}
}
void cat(int start){
	int i;
	r[start]=1;
	for(i = size; i; i--){
if( ( d[start][i] & CATDOOR ) &&  !r[i] )cat(i);

	}
}	
void mouse(int start){
	int i;
	for(i = size; i; i--){
if( ( d[start][i] & MOUSEDOOR ) &&  !r[i] )	{
	r[i]=2;
	mouse(i);
}else if( (d[start][i] & MOUSEDOOR )&&(r[i]==1)) mousecatreachable=1;
	}
}	

int main(){
	int N;
	scanf("%d", &N);
	while(N--){
scanf("%d %d %d", &size, &catr, &mouser);
init(size);
input(CATDOOR);	
input(MOUSEDOOR);
cat(catr);
mouse(mouser);
printf("%s ",(mousecatreachable || (r[mouser]==1))?"Y":"N");
printf("%s\n", r[mouser]==2?"Y":"N");
	}
	return 0;
}