Possiamo eliminare tutti i vertici tranne uno verificando l'esistenza di spigoli perché possiamo eliminare una possibilità per ogni spigolo che controlliamo. In particolare, se c'è un bordo che va da x a y , eliminiamo x e passiamo a y (poiché da esso è possibile raggiungere un altro vertice); in caso contrario, eliminiamo y (poiché non può essere raggiunto da x ). Una volta raggiunto l'ultimo vertice, qualsiasi vertice non eliminato dovrebbe essere confrontato con l'altro vertice (assicurarsi che la condizione superstar sia rispettata: c'è un vantaggio in arrivo ma non in uscita) fino a quando non viene eliminato o confermato come superstar. Alcuni pseudocodici: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
Vediamo un esempio per illustrare il metodo. Prendi questo array, con il vertice di origine in alto e la destinazione a lato. 1 indica un bordo:
12341−11121−11300−04111−
Grigherò i vertici che abbiamo escluso come potenziali superstar. Userò il verde e il rosso per indicare i bordi che stiamo osservando quando lo fanno e non contengono il bordo che stiamo cercando, e il blu per indicare dove abbiamo già guardato.
Iniziamo osservando i vertici 1 e 2.
Il numero verde indica che c'è un bordo da 2 a 1, quindi eliminiamo 2 e cerchiamo un bordo da 3 a 1 :
12341−11121−11300−04111−
12341−11121−11300−04111−
Vediamo che non esiste tale vantaggio, quindi eliminiamo 1 e prendiamo 3 come vertice corrente. Ricordiamo che ne abbiamo già eliminati 2, quindi vedi se c'è un vantaggio da 4 a 3:
12341−11121−11300−04111−
C'è un bordo da 4 a 3, quindi eliminiamo 4. A questo punto abbiamo eliminato tutti i vertici tranne uno (3), quindi controlla i suoi bordi e vedi se si qualifica:
12341−11121−11300−04111−
C'è un vantaggio da 1 a 3 ma non il contrario, quindi 3 è ancora un candidato.
12341−11121−11300−04111−
C'è anche un vantaggio da 2 a 3 ma non il contrario, quindi 3 è ancora un candidato.
12341−11121−11300−04111−
C'è un vantaggio da 4 a 3 ma non da 3 a 4; che completa il nostro controllo dei bordi di 3 e abbiamo scoperto che è, in effetti, una superstar.
n−1nnn−12×(n−1)3n−3O(n)Θ(n)