Мы можем исключить все, кроме одной из вершин, проверив наличие ребер, потому что мы можем исключить одну возможность для каждого проверяемого ребра. В частности, если существует ребро, идущее от к , мы исключаем и переходим к (так как из него можно добраться до другой вершины); если нет, мы исключаем (так как он не может быть достигнут из ). Как только мы достигаем последней вершины, любую вершину, не удаляемую, следует сравнивать с каждой другой вершиной (убедитесь, что условие суперзвезды поддерживается: есть ребро входящее, но не исходящее), пока оно не будет удалено или подтверждено как суперзвезда. Какой-то псевдокод:x y x y y xn - 1ИксYИксYYИкс
vertex superstar(graph g)
current vertex = first
# Go through each vertex
for each subsequent vertex in g ("next")
# If there's an edge from this to the next, we eliminate this one [move to the new one].
# If not, we just stay here.
if edge exists from current to next
candidate = next
end if
end for
# Now we are on the final remaining candidate, check whether it satisfies the requirements.
# just a rename for clarity
candidate = current
for each other vertex in g
if edge from current to other exists
return null
else if no edge from other to current
return null
end if
end for
return candidate
end superstar
Давайте рассмотрим пример, чтобы проиллюстрировать метод. Возьмите этот массив с исходной вершиной сверху и местом назначения сбоку. 1 обозначает ребро:
12341-11121-11300-04111-
Я выделю вершины, которые мы исключили, как потенциальных суперзвезд. Я буду использовать зеленый и красный, чтобы указать края, на которые мы смотрим, когда они есть, и не содержат искомого края, и синий, чтобы указать, где мы уже смотрели.
Начнем с рассмотрения вершин 1 и 2.
12341-11121-11300-04111-
Зеленое число показывает, что есть грань от 2 до 1, поэтому мы исключаем 2 и ищем грань от 3 до 1:
12341-11121-11300-04111-
Мы видим, что такого ребра нет, поэтому исключаем 1 и берем 3 в качестве текущей вершины. Напомним, что мы уже удалили 2, поэтому посмотрим, есть ли преимущество от 4 до 3:
12341-11121-11300-04111-
Имеется ребро от 4 до 3, поэтому мы исключаем 4. На этом этапе мы удалили все, кроме одной из вершин (3), поэтому проверьте его ребра и посмотрите, подходит ли оно:
12341-11121-11300-04111-
Существует преимущество от 1 до 3, но не наоборот, поэтому 3 все еще является кандидатом.
12341-11121-11300-04111-
Существует также преимущество от 2 до 3, но не наоборот, так что 3 все еще является кандидатом.
12341-11121-11300-04111-
Есть преимущество от 4 до 3, но не от 3 до 4; это завершает нашу проверку 3-х ребер, и мы обнаружили, что это на самом деле суперзвезда.
Поскольку мы исключаем одну вершину в качестве возможной суперзвезды в каждой из первых
проверок ребер, наилучшим случаем является то, что я проверка исключает конечную вершину для сложности . В худшем случае (последняя или вторая-последняя вершина является суперзвездой, или последняя проверка дисквалифицирует ее), после первых сравнений мы сравниваем кандидата с больше вершин, для в худшем случае сложность ( ). Итак, этот алгоритм
.n n n - 1 2 × ( n - 1 ) 3 n - 3 O ( n ) Θ ( n )n - 1NNn - 12 × ( n - 1 )3 n - 3O ( n )Θ ( н )