Podemos eliminar todos os vértices, exceto um, verificando a existência de arestas, porque podemos eliminar uma possibilidade para cada aresta que verificamos. Em particular, se houver uma aresta passando de x para y , eliminamos x e passamos para y (como outro vértice pode ser alcançado a partir dele); caso contrário, eliminamos y (pois não pode ser alcançado a partir de x ). Quando atingirmos o último vértice, o vértice que não for eliminado deve ser comparado com o outro (verifique se a condição de superestrela é mantida: existe uma aresta de entrada, mas não de saída) até que seja eliminada ou confirmada como superestrela. Algum pseudocódigo:n−1xyxyyx
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
Vamos percorrer um exemplo para ilustrar o método. Pegue essa matriz, com o vértice de origem na parte superior e o destino ao lado. 1 indica uma aresta:
12341−11121−11300−04111 1-
Vou esmaecer os vértices que descartamos como possíveis astros. Usarei verde e vermelho para indicar as arestas que estamos vendo quando elas contêm e não contêm a aresta que estamos procurando, e azul para indicar onde já olhamos.
Começamos olhando os vértices 1 e 2.
O número verde mostra que há uma aresta de 2 a 1, portanto, eliminamos 2 e procuramos uma aresta de 3 a 1 :
1 12341 1-1 11 11 121 1-1 11 130 00 0-0 041 11 11 1-
1 12341 1-1 11 11 121 1-1 11 130 00 0-0 041 11 11 1-
Como vemos que não existe essa aresta, eliminamos 1 e consideramos 3 como nosso vértice atual. Lembre-se de que já eliminamos 2 e verifique se há uma margem de 4 para 3:
1 12341 1-1 11 11 121 1-1 11 130 00 0-0 041 11 11 1-
Há uma aresta de 4 a 3, portanto, eliminamos 4. Nesse ponto, eliminamos todos os vértices (3), com exceção de um, então verifique suas arestas e veja se ele se qualifica:
1 12341 1-1 11 11 121 1-1 11 130 00 0-0 041 11 11 1-
Há uma margem de 1 a 3, mas não o inverso; portanto, 3 ainda é um candidato.
1 12341 1-1 11 11 121 1-1 11 130 00 0-0 041 11 11 1-
Há também uma margem de 2 a 3, mas não o inverso; portanto, 3 ainda é um candidato.
1 12341 1-1 11 11 121 1-1 11 130 00 0-0 041 11 11 1-
Há uma margem de 4 para 3, mas não de 3 para 4; que completa nossa verificação das arestas de 3 e descobrimos que é, de fato, uma estrela.
n - 1nnn - 12 × ( n - 1 )3 n - 3O ( n )Θ ( n )