Esercizio 22vertici influenzabili e vertici entro distanza d
In questa pagina 3
Testo.
Parte A (esempio di tema d'esame, seconda parte, esercizio 2, 6 punti). Sia un grafo che rappresenta una rete sociale con vertici ed archi. Ogni vertice ha un campo .influencer che vale se è un influencer e altrimenti. Un vertice non influencer si dice influenzabile se esiste un influencer e un cammino tra e . Progettare in pseudocodice un algoritmo Influenzabili che conti il numero di vertici influenzabili in , e analizzarne la complessità. Per avere punteggio pieno la complessità deve essere .
Parte B (scritto del 09/07/2024, seconda parte, esercizio 2, 7 punti; una variante compare in un esempio di tema d'esame). Un grafo non orientato, semplice, non necessariamente connesso, rappresenta gli utenti di un social network: ogni vertice è un utente e ogni arco una relazione di amicizia reciproca. Due utenti amici sono a grado di amicizia ; gli amici di uno dei due che non sono amici dell'altro hanno grado di amicizia rispetto a quest'ultimo, e così via. Scrivere un algoritmo che, preso in input il grafo rappresentato tramite liste di adiacenza, un qualsiasi utente e un intero , restituisca il numero degli utenti di che si trovano rispetto a a un grado di amicizia . (La variante dell'esempio di tema chiede, per ogni , di salvare in v.numNeighbors il numero di nodi a distanza da .) (a) Descrivere l'idea con un esempio. (b) Pseudocodice, specificando input e output. (c) Analizzare la complessità.
Parte A: vertici influenzabili
Idea
è influenzabile se sta nella stessa componente connessa di un influencer. Si lancia una visita (BFS o DFS, vedi Visite di grafi - BFS e DFSVisite in ampiezza (BFS) e in profondità (DFS) come design pattern; etichette discovery, cross e back edge; BFS tree e distanze; complessità Theta(n+m) con liste di adiacenza; applicazioni (connettività, componenti, spanning tree, cammini minimi non pesati, cicli, vertici a distanza al più d); esempio svolto su un grafo di 7 vertici.Visite di grafi - BFS e DFS →) da ogni influencer non ancora visitato: ogni vertice raggiunto è nella componente di un influencer. Al termine si contano i vertici visitati che non sono influencer.
Altra scelta: ogni influencer è una sorgente di una BFS; se un influencer è già visitato (perché nella componente di un altro) non serve ripartire, e la visita non riparte mai su vertici già visitati: ogni vertice è esaminato una sola volta.
Pseudocodice
Algoritmo Influenzabili(G)
Input: grafo G=(V,E) con liste di adiacenza; campo influencer di ogni vertice
Output: numero di vertici non influencer che stanno nella componente connessa di un influencer
forall v in V do v.ID <- 0
conta <- 0
forall v in V do
if v.influencer = 1 AND v.ID = 0 then
BFS(G, v) (visita tutta la componente di v ponendo ID <- 1)
forall v in V do
if v.ID = 1 AND v.influencer = 0 then conta <- conta + 1
return conta(In alternativa si conta durante la visita: ogni volta che si inserisce in lista un vertice con influencer = 0 si incrementa conta.)
Complessità
Ogni vertice viene scoperto al più una volta in tutte le chiamate (dopo la prima visita ha ID ) e ogni arco viene esaminato al più due volte (una per estremo), quindi le BFS costano in totale . I due cicli sui vertici costano . Totale con le liste di adiacenza.
Esempio. Vertici , archi (il vertice è isolato), influencer: e . La BFS da visita ; è un influencer non visitato: la BFS visita solo . Non influencer visitati: e influenzabili ( e stanno in una componente senza influencer). (Confronto con il calcolo delle componenti su 500 grafi casuali: risultati uguali.)
Parte B: vertici a distanza al più
Idea
La BFS da visita i vertici per livelli secondo la distanza da (vedi Visite di grafi - BFS e DFSVisite in ampiezza (BFS) e in profondità (DFS) come design pattern; etichette discovery, cross e back edge; BFS tree e distanze; complessità Theta(n+m) con liste di adiacenza; applicazioni (connettività, componenti, spanning tree, cammini minimi non pesati, cicli, vertici a distanza al più d); esempio svolto su un grafo di 7 vertici.Visite di grafi - BFS e DFS →). Basta fermarsi al livello : i vertici dei livelli sono esattamente quelli a distanza .
Esempio: cammino con un vertice adiacente ad e a . , , , . Per la risposta è (); per è ; per è (solo ).
Pseudocodice
Algoritmo contaEntro(G, s, d)
Input: grafo G (liste di adiacenza), vertice s, intero d >= 0; tutti gli ID valgono 0 e le label null
Output: numero di vertici a distanza <= d da s
s.ID <- 1; L0 <- lista con s; i <- 0; conta <- 1
while i < d AND Li non è vuota do
Li+1 <- lista vuota
forall v in Li do
forall e in G.incidentEdges(v) do
w <- G.opposite(v, e)
if w.ID = 0 then
w.ID <- 1; inserisci w in Li+1; conta <- conta + 1
i <- i + 1
return contaQui non occorre etichettare gli archi: basta il controllo su ID dei vertici. Se serve il risultato per tutti i vertici (primo testo), si ripete per ciascuno, riportando gli ID a ad ogni giro: .
Complessità
Ogni vertice entra in una lista al più una volta e di ciascun vertice dei livelli si scorre la lista di adiacenza: costo , dove ed sono vertici e archi coinvolti. Nel caso pessimo, per una sorgente. (Controllato con una implementazione confrontata con il calcolo di tutte le distanze su 300 grafi casuali.)
Errori comuni
- Parte A: contare anche gli influencer, o contare i vertici di tutte le componenti (anche senza influencer).
- Parte A: rilanciare la BFS da ogni influencer senza controllare
ID: ogni componente verrebbe visitata più volte, ma si può ancora arrivare a se molti influencer stanno nella stessa componente. - Parte B: usare la DFS (non dà le distanze minime) o arrestare la BFS al livello o .
- Dimenticare che il grafo può essere sconnesso: la BFS visita solo la componente di e i vertici fuori restano a distanza .
Versione ripasso
Testo. (A) Rete sociale con campo influencer: contare i vertici non influencer che hanno un cammino verso un influencer, in . (B) Dati , e : numero di vertici a distanza da .
- A, idea (vedi Visite di grafi - BFS e DFSVisite in ampiezza (BFS) e in profondità (DFS) come design pattern; etichette discovery, cross e back edge; BFS tree e distanze; complessità Theta(n+m) con liste di adiacenza; applicazioni (connettività, componenti, spanning tree, cammini minimi non pesati, cicli, vertici a distanza al più d); esempio svolto su un grafo di 7 vertici.Visite di grafi - BFS e DFS →): influenzabile = nella stessa componente di un influencer. Si lancia una BFS da ogni influencer con
ID = 0; si contano i vertici visitati coninfluencer = 0. - A, complessità: ogni vertice scoperto una volta, ogni arco al più due volte: .
- B, idea: BFS da che si ferma dopo aver costruito ; si contano i vertici in .
- B, pseudocodice:
s.ID <- 1; mentre e non è vuota: per ogni vicino conID = 0:w.ID <- 1, in ,conta++; restituisceconta. - B, complessità: per una sorgente; per tutti i vertici .
- A, pseudocodice:
forall v: v.ID <- 0; per ogni coninfluencer = 1eID = 0:BFS(G, v);conta= vertici conID = 1einfluencer = 0. Esempio: archi , vertice isolato, influencer e ⇒ influenzabili (, ). - B, esempio: cammino con adiacente ad e : , , , ⇒ per la risposta è .
- Complessità di B: una BFS ferma al livello costa ; ripetuta per tutti i vertici (variante con
v.numNeighbors) , azzerando gliIDa ogni giro. - Errori: contare anche gli influencer o componenti senza influencer; BFS non protetta da
ID; DFS per le distanze; livello .