Macierz zajmuje O(V^2) pamięci i daje O(1) sprawdzenie krawędzi, więc jest dobra dla gęstych grafów. Lista zajmuje O(V+E) pamięci i lepiej pasuje do rzadkich grafów oraz iterowania po sąsiadach.
Odpowiedź zaawansowana
Głębiej
Wybór zależy głównie od gęstości grafu i operacji, które dominują.
Lista sąsiedztwa:
Pamięć: O(V + E)
Iterowanie sąsiadów u: O(deg(u))
Sprawdzenie krawędzi (u, v): O(deg(u)), chyba że trzymasz set per wierzchołek
Macierz sąsiedztwa:
Pamięć: O(V^2)
Iterowanie sąsiadów u: O(V) (skanujesz cały wiersz)
Sprawdzenie krawędzi (u, v): O(1)
Kiedy co wybrać
Graf rzadki (E dużo mniejsze niż V^2): lista.
Graf gęsty albo mnóstwo zapytań o istnienie krawędzi: macierz.
Algorytmy:
BFS/DFS/Dijkstra: zwykle lista.
Floyd–Warshall / domknięcie przechodnie: macierz (często z bitsetami).