Grafy
Editovat
Note
|
Typy grafů, stromy, stupně vrcholů, orientované grafy, reprezentace grafů. Algoritmy prohledávání grafu do hloubky a do šířky a jejich využití. Komponenty souvislosti. IB000, IB002 |
Graf je uspořádaná dvojice , kde je množina vrcholů (uzlů, vertices) a je množina hran mezi vrcholy (edges).
V neorientovaném grafu je množina dvouprvkových podmnožin :
V orientovaném grafu je množina dvojic — relace na :
Grafové pojmy
- Stupeň vrcholu
-
U neorientovaných grafů je to počet hran vycházejících z vrcholu. U orientovaných rozlišujeme vstupní a výstupní stupeň.
- Souvislost
-
Možnost pohybovat se v neorientovaném grafu po cestách. Ekvivalence těch dvojic vrcholů, kteréžto cestou propojeny jsou.
- Slabá souvislost
-
Souvislost na orientovaných grafech, kde zanedbáváme směr hran.
- Dosažitelnost směrem ven
-
Existuje vrchol, z nehož se dá dostat do všech ostatních.
- Silná souvislost
-
Souvislost na orientovaných grafech, kde musí mezi vrcholy vést cesta tam i zpátky.
- Komponenta souvislosti
-
Třídy ekvivalence souvislosti, resp. podgrafy indukované těmito třídami. Maximální oblasti grafu, kde se dá dostat všude.
- Isomorfismus
-
Bijektivní zobrazení takové, že každá dvojice vrcholů je spojena hranou v , právě tehdy kdy v .
- Podgraf grafu
-
Libovolný graf takový, že , a obsahuje hrany pouze mezi vrcholy z . Píšeme .
- Indukovaný podgraf
-
Podgraf takový, že obsahuje všechny hrany z mezi vrcholy z .
- Acykličnost
-
Absence kružnic.
Typy grafů
- d-regulární
-
Všechny vrcholy mají stejný stupeň.
- Kružnice délky
-
Má různých vrcholů spojených v cyklu. Značí se .
- Cesta délky
-
Má různých vrcholů spojených "za sebou". Značí se .
- Jednoduchá cesta
-
Cesta, která neobsahuje dva stejné vrcholy.
- Úplný graf na
-
Má hrany mezi všemi vrcholy. Značí se .
- Bipartitní graf
-
Vrcholy lze rozdělit na dvě skupiny, které mají hrany pouze mezi sebou, nikoliv mezi svými členy.
- Úplný bipartitní graf na a
-
Má vrcholů ve dvou skupinách. Hranami jsou spojeny všechny dvojice z různých skupin. Značí se .
- Hvězda s rameny
-
Úplný bipartitní graf .
- Les
-
Acyklický graf. Nemusí být souvislý.
- Strom
-
Souvislý, acyklický graf.
-
Pokud má víc než jeden vrchol, pak existuje vrchol se stupněm 1.
-
Strom na má přesně hran.
-
Mezi každými dvěma vrcholy vede právě jedna cesta.
-
Přidáním jedné nové hrany do stromu vznikne jedna kružnice.
-
Reprezentace grafů
-
Obrázkem pro lidi
-
Seznamem vrcholů a hran
-
Tabulkou (maticí z/do)
Průchod grafem
Do hloubky — Depth-First Search (DFS)
-
Prohledání po "slepých uličkách".
-
Dá se jednoduše zapsat rekurzivně, protože používá zásobník.
-
Používá při výpočtu topologického uspořádání uzlů, k nalezení silných komponent, zjištění přítomnosti cyklů, …
def dfs(graph: List[List[bool]], stamps: List[int], vertex: int) -> None:
if stamps[vertex] == -1:
stamps[vertex] = 0
stamp = stamps[vertex]
for i in range(0, len(graph)):
if graph[vertex][i] and stamps[i] != -1:
stamps[i] = stamp + 1
dfs(graph, stamps, i)
Do šířky — Breadth-First Search (BFS)
-
Prohledávání po "vrstvách".
-
Nedá se jednoduše zapsat rekurzivně, protože používá frontu.
-
Používá se při hledání nejkratších cest. Součást Dijkstrova algoritmu.
-
Součást Jarníkova algoritmu na hledání minimální kostry grafu.
def bfs(graph: List[List[bool]], stamps: List[int], vertex: int) -> None:
stamp = 0
queue = deque()
queue.append(vertex)
while len(queue) > 0:
current = queue.popleft()
stamps[current] = stamp
stamp += 1
for i in range(0, len(graph)):
if graph[current][i] and stamps[i] == -1:
queue.append(i)