Олимпиадный тренинг

Задача . rRyz_2008_E_Рекурсия


Задача

Темы:
Одним из важных понятий, используемых в теории алгоритмов, является рекурсия. Неформально ее можно определить как использование в описании объекта самого себя. Если речь идет о процедуре, то в процессе исполнении эта процедура напрямую или  косвенно (через другие процедуры) вызывает сама себя.
Рекурсия является очень «мощным» методом построения алгоритмов, но таит в себе некоторые опасности. Например, неаккуратно написанная рекурсивная процедура может войти в бесконечную рекурсию, то есть, никогда не закончить свое выполнение (на самом деле, выполнение закончится с переполнением стека).
Поскольку рекурсия может быть косвенной (процедура вызывает сама себя через другие процедуры), то задача определения того факта, является ли данная процедура рекурсивной, достаточно сложна. Попробуем решить более простую задачу.
Рассмотрим программу, состоящую из n процедур P1, P2, …, Pn. Пусть для каждой процедуры известны процедуры, которые она может вызывать. Процедура P называется потенциально рекурсивной, если существует такая последовательность процедур Q0, Q1, …, Qk, что Q0 = Qk = P и для i = 1…k–1 процедура Qi-1 может вызвать процедуру Qi. В этом случае задача будет заключаться в определении для каждой из заданных процедур, является ли она потенциально рекурсивной.
Требуется написать программу, которая позволит решить названную задачу.
Формат входных данных
Первая строка входного файла содержит целое число n — количество процедур в программе (1 ≤ n ≤ 100).
Далее следуют n блоков, описывающих процедуры. Блоки отделены друг от друга и от первой строки входного файла строками, каждая из которых содержит по 5 символов «*».
Описание процедуры начинается со строки, содержащий ее идентификатор, состоящий только из маленьких букв латинского алфавита и цифр. Идентификатор непуст, и его длина не превосходит 100 символов. Далее идет строка, содержащая число k (kn ) — количество процедур, которые могут быть вызваны описываемой процедурой. Последующие k строк содержат идентификаторы этих процедур — по одному идентификатору на строке.
Различные процедуры имеют различные идентификаторы. При этом ни одна процедура не может вызвать процедуру, которая не описана во входном файле.
Формат выходных данных
Для каждой процедуры, присутствующей во входном файле, необходимо вывести слово YES, если она является потенциально рекурсивной, и слово NO – в противном случае.
Следуйте формату вывода, приведенному в примере. Процедуры в выходном файле должны быть выведены в том же порядке, в каком они перечислены во входном файле.
Пример входного и выходного файлов
входные данные выходные данные
3
p1
2
p1
p2
*****
p2
1
p1
*****
p3
1
p1
p1: YES
p2: YES
p3: NO

 

time 500 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя