Tarjan's SCC: Esempio che mostra la necessità della definizione di lowlink e della regola di calcolo?

cs.stackexchange https://cs.stackexchange.com/questions/96635

Domanda

Diverse domande (1, 2) sono già stati chiesti su questo argomento, ma sto cercando di essere più specifico.

In Algoritmo SCC di Tarjan, il calcolo di Lowlink quando si incontra un vertice che è già sullo stack è

    // It says w.index not w.lowlink; that is deliberate and from the original paper
    v.lowlink  := min(v.lowlink, w.index)

Comprendo che questa regola è necessaria per calcolare il Link Lowlind di conseguenza alla sua definizione formale, che nel documento di Tarjan è (l'enfasi è mia)

Lowlink (V) è il vertice più piccolo che è nello stesso componente di V ed è raggiungibile attraversando zero o più archi di alberi seguiti da al massimo uno bordo posteriore] o [bordo incrociato].

Quello che non capisco è:

  1. Rimozione della restrizione enfatizzata nella definizione porta a un calcolo con v.lowlink := min(v.lowlink, w.lowlink) ?
  2. Rimozione della restrizione enfatizzata porta a un rilevamento errato degli SCC di un grafico (In tal caso, sto cercando un esempio di tale grafico)? In caso contrario, questa modifica garantirebbe che in un determinato SCC, tutti i nodi alla fine hanno lo stesso valore di lowlink (di nuovo, in caso contrario, sto cercando un controesempio)?

Attualmente sono nel seguente punto (che potrebbe essere sbagliato!):

Lascia che V e W siano come nel codice (esplorando i successori di V, w già sullo stack). V è anche sullo stack, e così è R, la radice di V e W's SCC (in senso di Tarjan) (è un antenato comune di V e W nell'albero che spanning).

Per la proposta di modifica dell'algoritmo per produrre un cattivo risultato, è necessario avere W.Lowlink <R.Lowlink (questo è il caso in cui, propagando le informazioni di bassista a R dopo aver terminato DFS, otterremo un valore incoerente per r). Affinché ciò accada, W deve aver ottenuto il suo valore di basso livello da un vertice x scoperto prima di R e appartenente a un SCC diverso rispetto a R. Ma X deve essere nello stack quando stavamo dfsing da W (se non fosse stato il caso, non si sarebbe aggiornato W.Lowlink quando raggiungeva X perché X è già scoperto in quel momento). Poiché X viene scoperto prima di R, è più profondo nello stack di R, e quindi è ancora nello stack quando stiamo dfsing da v. Ma poi tutti questi nodi appartengono allo stesso SCC, radicato da X.Lowlink ?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top