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; }