SZZ materiály

12

Grafy (definice orientovaného a neorientovaného grafu, jejich vlastnosti a reprezentace, význačné typy grafů), stromy (vymezení a základní charakteristiky, binární stromy a jejich reprezentace), eulerovské a hamiltonovské grafy (eulerovský tah, hamiltonovská kružnice a cesta), prohledávání do hloubky a do šířky

Užitečné odkazy

Graf

Graf je definován jako uspořádaná dvojice: \(G = (V, E)\)

kde:

Typy grafů

Vrchol

Hrana

Pokud $e = (u, v)$ je hrana, říkáme, že $u$ je počáteční vrchol, $v$ je koncový vrchol hrany $e$ a že hrana $e$ je incidentní s vrcholy $u$, $v$.

Slovo incidentní znamená, že hrana je připojená k vrcholu.

Sled

Sled délky $k$ z vrcholu $u$ do vrcholu $v$:

\[p = (u_0, u_1, \ldots, u_k), \quad \text{kde } u = u_0,\ v = u_k\]

kde

Tah

Cesta

Graf na obrázku: \(V = \{A, B, C, D, E\}\)

\[E = \{(A,B), (B,C), (C,D), (D,E)\}\]

Vlastnost zavřený a otevřený

Formálně: \(u_0 = u_k \quad \text{(uzavřený)}\) \(u_0 \neq u_k \quad \text{(otevřený)}\)

Platí obecně pro:

Jednoduchý cyklus

Cyklus

Neorientovaný graf

Vlastnosti neorientovaného grafu

Orientovaný graf

Vlastnosti orientovaného grafu

Reprezentace grafů

Seznam sousedů

Příklad

// Neorientovaný graf
Dictionary<string, string[]> graph = new()
{
    ["A"] = ["B", "C"],
    ["B"] = ["A", "D"],
    ["C"] = ["A"],
    ["D"] = ["B"]
};
// Orientovaný graf
Dictionary<string, string[]> graph = new()
{
    ["A"] = ["B", "C"],
    ["B"] = ["D"],
    ["C"] = [],
    ["D"] = []
};

Matice sousednosti

Příklad

    A B C D
A [ 0 1 1 0 ]
B [ 1 0 0 1 ]
C [ 1 0 0 0 ]
D [ 0 1 0 0 ]
// Neorientovaný graf
int[,] graph =
{
    { 0, 1, 1, 0 },
    { 1, 0, 0, 1 },
    { 1, 0, 0, 0 },
    { 0, 1, 0, 0 }
};
// Orientovaný graf
int[,] graph =
{
    { 0, 1, 1, 0 },
    { 0, 0, 0, 1 },
    { 0, 0, 0, 0 },
    { 0, 0, 0, 0 }
};

Matice incidence

Příklad

      e₁ e₂ e₃
A  [  1  1  0 ]
B  [  1  0  1 ]
C  [  0  1  0 ]
D  [  0  0  1 ]
// Neorientovaný graf
int[,] graph =
{
    { 1, 1, 0 },
    { 1, 0, 1 },
    { 0, 1, 0 },
    { 0, 0, 1 }
};
// Orientovaný graf
int[,] graph =
{
    { -1, -1,  0 },
    {  1,  0, -1 },
    {  0,  1,  0 },
    {  0,  0,  1 }
};

U orientovaného grafu se často používá:

Význačné typy grafů

Úplný graf

Souvislý graf

Cyklický graf

Acyklický graf

Bipartitní graf

Strom

Binární strom

Reprezentace binárních stromů

Eulerovský graf

Eulerovský tah

Eulerovská kružnice

Podmínky (neorientovaný souvislý graf)

Příklad

Hamiltonovský graf

Hamiltonovská cesta

Hamiltonovská kružnice

Rozdíl oproti eulerovskému grafu

  Euler Hamilton
Co procházíme hrany vrcholy
Jednoduchá podmínka existence ano (stupně vrcholů) obecně ne
Obtížnost rozhodnutí polynomiální NP-obtížné

Praktické poznámky

Příklad

Prohledávání grafu

Prohledávání do hloubky

Prohledávání do šířky