Доказательство корректности графового алгоритма - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь понять алгоритм, который находит края среза для графика.Вырезанное ребро - это ребро, которое делит связанный граф на несвязный граф, и ни одно из ребер, лежащих в цикле, не может быть отрезанным ребром.

Возможно, я понимаю алгоритм, но не уверен, как написать доказательство правильности.Я даю ссылку ниже, а также прилагаю изображение алгоритма для справки.

Используемый алгоритм выглядит следующим образом:

G - это граф со списком смежности g.visited массив заботится о том, посетили ли мы узел или нет.low - это массив, который отслеживает самый низкий идентификатор, который может быть достигнут из определенного узла.Массив bridges хранит все мосты.

function dfs(at, parent, bridges):
     visited[at]=true
     id=id+1
     low[at]=ids[at]=id

     for(to: g[at]):
          if(to==parent) continue;
             if(!visited[to]):
                dfs(to,at,bridges)
                low[at]=min(low[at],low[to])
                if(ids[at]<low[to]
                bridges(at,to)
            else
                // if we reach here means
                // there is a cycle, so we just compare the id of the 
                // `to` and the `low` of `at`.
                low[at]=min(low[at],ids[to]) 

Одна вещь, которую я заметил в своем исследовании в Интернете, состоит в том, что большинство алгоритмов графов доказано с использованием противоречия.Если я подхожу к своей проблеме аналогичным образом, я могу сказать: «Давайте предположим, что алгоритм не дает вам острых углов».Я не уверен, как мне доказать, что мое предположение неверно, учитывая алгоритм, упомянутый в видео. Алгоритм

https://youtu.be/aZXi1unBdJA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...