Это разумное начало, но я вижу две проблемы. Во-первых, оптимальное решение может быть не единственным. Рассмотрим четырехвершинный путь a-b-c-d
, который имеет три оптимальных решения: {a,c}, {b,c}, {b,d}
. Во-вторых (и вы, наверное, уже это делаете, но не сказали), необходимо считать дерево укорененным. В противном случае, например, на графе a-b
мы имеем L = {a,b}
и N(L) = {b,a}
, а полученное вершинное покрытие равно W = {b,a}
, что не является оптимальным. Обозначая a
как корень, он по определению исключается из набора листьев.
Чтобы формально доказать правильность программы, включающей цикл, часто полезно использовать индукцию для установления инварианта цикла. Разрешите предложить два.
Для всех моментов времени t (где время = количество итераций цикла) пусть G(t) будет тем, что осталось от G в момент времени t, и пусть W(t) будет значением W в момент времени t. Для каждого вершинного покрытия X группы G(t) множество W(t) X является вершинным покрытием G(0), где 0 — время начала.
Для всех моментов времени t существует оптимальное решение, содержащее W(t) в качестве подмножества.
Пусть Т будет конечным временем. Поскольку G(T) — пустой граф, X = — допустимое вершинное покрытие G(T), поэтому инвариант № 1 устанавливает, что W(T) — вершинное покрытие G(0). Инвариант № 2 устанавливает, что W(T) содержится в некотором оптимальном решении. Поскольку W(T) само по себе является вершинным покрытием, W(T) само должно быть этим оптимальным решением.
Индуктивный шаг в доказательстве инварианта № 2 состоит в том, чтобы при наличии оптимального решения, содержащего W(t-1), но не содержащего W(t), превратить его в другое оптимальное решение, содержащее W(t). Это включает в себя формализацию вашей интуиции, что всегда, по крайней мере, так же продуктивно, как взять соседа листа вместо листа.
person
David Eisenstat
schedule
09.10.2014