대입문 평가 순서 (Small)

각 식이 함수 호출인 대입문 목록이 주어질 때 모든 변수를 계산할 수 있는 순서가 있는지 판정한다. 의존 관계에 사이클이 있으면 불가능하다.

보통4그래프위상 정렬DFS구현면접 대비아직 제출이 없습니다시간 제한5초메모리 제한1024 MB

문제

순서가 정해지지 않은 대입문 목록이 주어진다. 모든 변수를 평가할 수 있는 순서로 대입문을 배열할 수 있는지 판별하는 프로그램을 작성하라.

이 문제에서 대입문은 대입 변수, 대입 연산자, 식이 이 순서로 이어진 것이다. 대입문은 여러분이 정한 순서대로 한 번에 하나씩 평가한다. 어떤 변수는 앞선 대입문의 대입 변수로 쓰인 적이 있을 때만 평가할 수 있다.

문제를 단순하게 하려고 모든 식은 함수 호출 하나로만 이루어진다. 함수는 인자를 몇 개든 받으며 인자가 없을 수도 있다. 인자가 없는 함수 호출은 언제나 유효하고, 인자가 있는 함수 호출은 인자로 쓰인 변수를 모두 평가할 수 있을 때만 유효하다.

예를 들어 다음 대입문 목록을 보자.

a=f(b,c)
b=g()
c=h()

다음 순서로 놓으면 모든 대입문이 유효하다.

b=g()
c=h()
a=f(b,c)

이유는 두 가지다. g()h()는 어떤 변수에도 의존하지 않으므로 bc를 평가할 수 있다. a의 식은 bc에 의존하는데 둘 다 평가할 수 있으므로 a도 평가할 수 있다.

반면 다음 순서는 유효하지 않다.

b=g()
a=f(b,c)
c=h()

f(b,c)가 변수 c를 인자로 받지만, 이 시점에 c는 아직 어떤 대입문의 대입 변수로도 쓰이지 않았기 때문이다.

또 다른 예는 a=f(a)이다. 식 f(a)가 변수 a 자신에 의존하므로 이 대입문은 평가할 수 없다.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스의 첫 줄에는 대입문의 개수 NN이 주어지고, 이어지는 NN개의 줄에 대입문이 한 줄에 하나씩 주어진다.

각 대입문은 대입 변수, 대입 연산자, 식 세 부분으로 이루어지며 사이에 공백이 없다. 대입 연산자는 항상 =이다. 모든 식은 함수 이름, (, 쉼표로 구분된 변수 이름 0개 이상, )가 이 순서로 이어진 형태다. 모든 변수 이름과 함수 이름은 영어 소문자로만 이루어지며 길이가 1 이상이다. 변수 이름이 함수 이름과 같은 경우는 없다. 한 변수가 대입 변수로 두 번 이상 나오지는 않는다. 다만 같은 변수가 여러 함수 호출에 나올 수 있고 한 함수 호출 안에 여러 번 나올 수도 있으며, 같은 함수가 여러 번 나올 수도 있다.

제한

  • 1T201 \le T \le 20
  • 모든 함수는 인자를 0개 이상 10개 이하로 받는다.
  • 모든 변수 이름은 영어 소문자 1자 이상 20자 이하로 이루어진다.
  • 1N1001 \le N \le 100

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yy는 모든 변수를 평가할 수 있으면 GOOD, 그렇지 않으면 BAD이다.