From 8d6ee5c09699332a72afd5c045f3e79801ca5f77 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Wed, 6 May 2020 16:15:46 +0200
Subject: [PATCH] DFS

---
 10-dfs/dfs-strom.py      | 27 +++++++++++++++++++++++++++
 10-dfs/dfs.py            | 28 ++++++++++++++++++++++++++++
 10-dfs/graf.in           | 13 +++++++++++++
 10-dfs/hloubka-stromu.py | 25 +++++++++++++++++++++++++
 10-dfs/strom.in          | 10 ++++++++++
 5 files changed, 103 insertions(+)
 create mode 100755 10-dfs/dfs-strom.py
 create mode 100755 10-dfs/dfs.py
 create mode 100644 10-dfs/graf.in
 create mode 100755 10-dfs/hloubka-stromu.py
 create mode 100644 10-dfs/strom.in

diff --git a/10-dfs/dfs-strom.py b/10-dfs/dfs-strom.py
new file mode 100755
index 0000000..9225018
--- /dev/null
+++ b/10-dfs/dfs-strom.py
@@ -0,0 +1,27 @@
+#!/usr/bin/python3
+# Prohledávání do hloubky ve stromu
+
+# Načteme vstup: počet vrcholů, počet hran, pak hrany
+n = int(input())
+m = int(input())
+sousede = [[] for _ in range(n)]
+for _ in range(m):
+    u, v = map(int, input().split())
+    u -= 1   # Na vstupu vrcholy číslujeme od 1 do n
+    v -= 1
+    sousede[u].append(v)
+    sousede[v].append(u)
+
+# Rekurzivní funkce pro prohledávání, předáváme si rodiče,
+# abychom do něj nešli znovu.
+def dfs(v, rodic=None):
+    # print('Enter:', v+1)
+
+    for s in sousede[v]:
+        if s != rodic:
+            dfs(s, v)
+
+    # print('Exit:', v+1)
+
+
+dfs(0)
diff --git a/10-dfs/dfs.py b/10-dfs/dfs.py
new file mode 100755
index 0000000..e40d127
--- /dev/null
+++ b/10-dfs/dfs.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python3
+# Prohledávání do hloubky v obecném grafu.
+
+# Načteme vstup: počet vrcholů, počet hran, pak hrany
+n = int(input())
+m = int(input())
+sousede = [[] for _ in range(n)]
+for _ in range(m):
+    u, v = map(int, input().split())
+    u -= 1
+    v -= 1
+    sousede[u].append(v)
+    sousede[v].append(u)
+
+# Značíme si, kde už jsme byli
+znacka = [False]*n
+
+def dfs(v):
+    # print('Enter', v+1)
+    znacka[v] = True
+
+    for s in sousede[v]:
+        if not znacka[s]:
+            dfs(s)
+
+    # print('Exit', v+1)
+
+dfs(0)
diff --git a/10-dfs/graf.in b/10-dfs/graf.in
new file mode 100644
index 0000000..a8da5c8
--- /dev/null
+++ b/10-dfs/graf.in
@@ -0,0 +1,13 @@
+9
+11
+1 2
+1 3
+1 4
+3 5
+3 6
+4 7
+6 8
+8 9
+2 9
+7 9
+6 7
diff --git a/10-dfs/hloubka-stromu.py b/10-dfs/hloubka-stromu.py
new file mode 100755
index 0000000..254b1c7
--- /dev/null
+++ b/10-dfs/hloubka-stromu.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python3
+# Aplikace DFS na výpočet hloubky stromu.
+
+# Načteme vstup: počet vrcholů, počet hran, pak hrany
+n = int(input())
+m = int(input())
+sousede = [[] for _ in range(n)]
+for _ in range(m):
+    u, v = map(int, input().split())
+    u -= 1
+    v -= 1
+    sousede[u].append(v)
+    sousede[v].append(u)
+
+# Rekurzivní funkce, která spočítá hloubku podstromu
+# pod daným vrcholem.
+def hloubka(v, rodic=None):
+    h = 0
+    for s in sousede[v]:
+        if s != rodic:
+            h = max(h, hloubka(s, v) + 1)
+
+    return h
+
+print(hloubka(0))
diff --git a/10-dfs/strom.in b/10-dfs/strom.in
new file mode 100644
index 0000000..106db0f
--- /dev/null
+++ b/10-dfs/strom.in
@@ -0,0 +1,10 @@
+9
+8
+1 2
+1 3
+1 4
+3 5
+3 6
+4 7
+6 8
+8 9
-- 
GitLab