Имеется огромный проект на С++ (около 9681 файлов исходников). И есть утилитарный скрипт, в котором основная задача сказать, встречаются ли два отдельно взятых файла в какой-либо единице трансляции (название единицы трансляции не важно). Иными словами, если имееются foo.h и bar.h и нужно сказать включены ли одновременно оба эти файла в какою-либо единицу трансляции, например baz.cpp.
Подскажите пожалуйста алгоритм/структуру данных чтоб можно было быстро дать ответ на вопрос из предыдущего абзаца. Причем ответ надо давать довольно часто (порядка 500 раз за прогон скрипта) и для разных пар файлов.
Disjoint Set (aka Union Find) не подходит, т.к. один заголовочный файл может включатся в разные единицы трансляции. Причем сами единицы трансляции имеют разный набор включенных файлов. Например, если имеется:
bar.h foo.h baz.h | / \ | bar.cpp baz.cppто, bar.h и baz.cpp не имеют соединения. И, что важно, bar.h и baz.h не встречаются вместе ни в одной единице трансляции.