В сильно связанном графе G должен быть путь от любого узла A к любому (другому) узлу B.
Для начала обратите внимание, что в перевернутом графе есть путь от B до A G 'тогда и только тогда, когда в исходном графе G. есть путь от A к B.
Предположим, что DFS начинается в некотором исходном узле O.
Сначала покажем, что если G сильно подключено, алгоритм возвращает значение true.
- Первая DFS достигнет всех узлов, поскольку, по предположению, существует путь от O до каждого другого узла.
- Опять по предположению, есть путь от каждого узла до O. Из этого следует, что в G '(где все ребра перевернуты) есть путь от O до каждого другого узла. Таким образом, вторая DFS также достигнет всех узлов, и алгоритм вернет true.
Теперь рассмотрим граф G, который не является сильно связанным, т. Е. Есть пара узлов (A, B), такая, что не существует пути от A до B. Мы должны показать, что алгоритм возвращает false. Необходимо рассмотреть два случая:
- Нет пути от A до O . В этом случае перевернутый граф G 'не может содержать путь от O до A. Следовательно, вторая DFS не достигнет A из O, и алгоритм вернет false.
- Существует путь от A к O : в этом случае не может быть пути от O к B, потому что, если бы он был, наше предположение об отсутствии пути от A к B было бы неверным. Поскольку нет пути от O к B, первая DFS не достигнет B из O, и алгоритм возвращает false.
Мы доказали, что алгоритм возвращает true, если G сильно связан, и false в противном случае. Поэтому это правильно.