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

Код:
#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;
}