Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (024 --027 Suche nach Tiefenprioritäten)

1. Zweck

Lösen Sie 100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten in Python. Das Ziel ist es, hellblau zu werden, wenn Sie alles gelöst haben.

Dieser Artikel ist "024-027 Depth Priority Search".

2. Zusammenfassung

Es ist einfach, in den folgenden Artikel zu schreiben, aber ich habe lange gebraucht, um `` BFS``` und `DFSzu verstehen.bfsWanndfs```の基本形をおさえるまでに、最初は解説を読んでもまったくわからず、理解するまでに1週間くらい(1日10時間以上悩むこWannもあった)かかっています。

Natürlich habe ich den Kommentar gelesen, um zu verstehen, aber ich habe versucht, den Code zu debuggen, der durch `` `AC``` geht, und zu sehen, wie die Daten Zeile für Zeile funktionieren. Ich tat es, bis ich begriff, dass ich es bestätigen würde. Was die Wiederholung betrifft, habe ich tatsächlich alle rekursiven Berechnungen in eine Notiz geschrieben.

Dann wurde irgendwann die Datenstruktur von `BFS``` und` `DFS``` in meinem Kopf erstellt, und selbst wenn ich nichts in das Notizbuch schrieb, dachte ich` Es war möglich, Daten wie BFS, `` `DFS zu verschieben. Vielleicht kommt dieser Moment je nach Individuum, aber ich denke, dass er nicht ohne ein gewisses Maß an Denken (Versuch?) Kommen wird.

Darüber hinaus verwendet das Debugging den Entwickler von VS-Code. Praktisch. So was. image.png

3. Hauptgeschichte

024 --027 Suche nach Tiefenpriorität

024. ALDS_11_B - Tiefe Prioritätssuche

image.png image.png

Antworten


N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N):
    i, num, *nodes = map(int, input().split())
    graph[i] = nodes #Gerichteter Graph

go_time = [0] * (N+1)
back_time = [0] * (N+1)

def dfs(node, t):
    #Aufzeichnung des Gehens
    t += 1
    go_time[node] = t
    for next_node in graph[node]:
        if go_time[next_node] == 0:
            t = dfs(next_node, t)
    #Aufzeichnung der Rückkehr
    t += 1
    back_time[node] = t
    return t

t = 0
for node in range(1, N+1): #Versuchen Sie, von allen Punkten aus zu beginnen
    if go_time[node] == 0:
        t = dfs(node, t)
    print(node, go_time[node], back_time[node])

Erstens ist das Empfangen von Daten mühsam. In Bezug auf den Empfang von Diagramminformationen ist der Ort, an dem die Länge variabel ist, der letzte wie i, num, * node = map (int, input (). Split ()) Sie können den Rest an Knoten``` übergeben, indem Sie * zu * Knoten` `` hinzufügen. Referenz-> Beispiele und Listen in Python entpacken (erweitern und mehreren Variablen zuweisen)

Wie Sie sehen können, können Sie einige Teile nicht erreichen, selbst wenn Sie bei 1 beginnen (ich weiß nicht, wo Sie dies in der Problemstellung lesen können ...). Versuchen Sie also alle Punkte als Kandidaten für den Start wird gebraucht.

Sowohl `dfs``` durch diesmal rekursives Schreiben als auch` dfs durch `` `deque (im Fall von Python) müssen sich zuerst den Basistyp und die Erklärung des Basistyps merken Ist ziemlich schwierig für mich, also werde ich es weglassen. Vorerst werde ich diese Grundform lernen und zunächst fortfahren.


025. AOJ 1160 - Wie viele Inseln gibt es?

image.png image.png

Antworten


from collections import deque

def main(w, h, MAP, visited):
    count = 0
    #Versuchen Sie, von allen Punkten aus zu beginnen
    for start_y in range(h):
        for start_x in range(w):
            if MAP[start_y][start_x] == 0: #Überspringen Sie im Falle des Meeres
                continue
            if visited[start_y][start_x] != -1: #Überspringen Sie die Suche
                continue
            q = deque()
            q.append((start_y, start_x))
            visited[start_y][start_x] = 1
        
            while q:
                y, x = q.pop()

                for dy in range(-1, 2):
                    for dx in range(-1, 2):
                        moved_y = y + dy
                        moved_x = x + dx

                        if moved_y < 0 or h-1 < moved_y or moved_x < 0 or w-1 < moved_x: #Überspringen Sie das Verlassen der Karte
                            continue
                        if MAP[moved_y][moved_x] == 0: #Überspringen Sie im Falle des Meeres
                            continue
                        if visited[moved_y][moved_x] != -1: #Überspringen Sie die Suche
                            continue
                        visited[moved_y][moved_x] = 1
                        q.append((moved_y, moved_x))
            
            count += 1 #Eine Insel nach der Durchreise
    return count

if __name__ == "__main__":

    answer_list =[]
    while True:
        w, h = map(int, input().split())
        MAP = [list(map(int, input().split())) for _ in range(h)]
        visited = [[-1] * w for _ in range(h)]

        if w == 0 and h == 0:
            break
        
        answer = main(w, h, MAP, visited)
        answer_list.append(answer)

    for answer in answer_list:
        print(answer)

Persönlich ist es einfacher, `dfs``` per Deck zu schreiben (decue?) Als rekursiv. Dies ist auch die Grundform von `dfs``` (glaube ich), also schreibe es einfach so wie es ist.


  1. AtCoder Beginner Contest 138 D - Ki image.png

Antworten


from collections import deque
# -------------- [Eingang] --------------
N, Q = map(int, input().split()) #N ist die Anzahl der Eckpunkte, Q ist die Anzahl der Operationen
graph = [[] for _ in range(N+1)]
for _ in range(N-1):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)

counts = [0] * (N+1)
for _ in range(Q):
    p, x  = map(int, input().split())
    counts[p] += x
visited = [-1] * (N+1)
# -------------- [Beginnen Sie mit 1] --------------
q = deque()
q.append(1)
visited[1] = 1
# -------------- [DFS] --------------
while q:
    node = q.pop()

    next_nodes = graph[node]
    for next in next_nodes:
        if visited[next] != -1:
            continue
        q.append(next)
        visited[next] = 1
        counts[next] += counts[node] #Fügen Sie die elterliche Punktzahl hinzu

print(*counts[1:])

Dieses Problem ist AtCoder Anfängerwettbewerb 176 D - Assistent in Labyrinth (Klicken Sie hier für meinen Antwortartikel → AtCoder ABC 176 Python (A ~ E) )) Ich fand es ein bisschen so. Dieses Problem ist einfacher, aber ...

Was ähnlich ist, ist `zählt [weiter] + = zählt [Knoten]` in diesem Teil, `besucht [bewegt_y] [bewegt_x] = besucht [in ABC 176] y] [x] `Hier.

Der Grund, warum ich dachte, dass es ähnlich ist, ist, wenn ich von dem mit `q.pop ()` extrahierten Suchziel (nennen wir es ①) zum Suchziel (nennen wir es ②) neben dem Suchziel moving gehe. Dies liegt daran, dass der Prozess des Aktualisierens der Informationen in (2) unter Verwendung der Informationen in (1) ähnlich ist.

In normalen (?) `DFS``` und BFS denke ich, dass die Aktualisierung der Informationen in ② oben oft eine andere Liste oder nur ein Inkrement ist, aber dieselbe Liste Ich dachte, es wäre schwierig, die Methode zur Aktualisierung der oben genannten Informationen zu finden, wenn ich es nicht einmal tun würde. Sobald Sie diesen Punkt verstanden haben, unterscheidet sich der Rest nicht wesentlich von der Grundform von `` `BFS.


027. JOI 2009 Qualifying 4-Thin Ice Crossing

image.png

Antworten


import sys
sys.setrecursionlimit(10**9)

# -------------- [Ursprünglicher Wert] --------------
def dfs(count, start_y, start_x, visited):
    ans = count
    for dy, dx in moves:
        moved_y = start_y + dy
        moved_x = start_x + dx
        if moved_y < 0 or n-1 < moved_y or moved_x < 0 or m-1 < moved_x:
            continue
        if grid[moved_y][moved_x] == 0:
            continue
        if visited[moved_y][moved_x] != -1:
            continue
        visited[start_y][start_x] = 1
        ans = max(ans, dfs(count+1, moved_y, moved_x, visited)) #Holen Sie sich den Maximalwert, der vom Startpunkt aus erreicht werden kann
        visited[start_y][start_x] = -1
    
    return ans


if __name__ == "__main__":
    # -------------- [Eingang] --------------
    m = int(input()) #Seite
    n = int(input()) #Vertikal
    grid = [list(map(int, input().split())) for _ in range(n)] # 1:Eis, 0:Kein Eis
    moves = [(1, 0), (0, 1), (-1, 0), (0, -1)] #Nur oben, unten, links und rechts
    visited = [[-1] * m for _ in range(n)]
    # -------------- [Probieren Sie alle Punkte als Ausgangspunkt aus] --------------
    answer = 0
    for start_y in range(n):
        for start_x in range(m):
            if grid[start_y][start_x] == 0:
                continue
            answer = max(answer, dfs(1, start_y, start_x, visited))

    print(answer)


sys.setrecursionlimit(10**9)Sie können ohne es passieren, aber ich werde es als Erinnerung verlassen.


 Dies ist fast das gleiche wie die Grundform, aber der Unterschied ist

```python

ans = max(ans, dfs(count+1, moved_y, moved_x, visited)) #Holen Sie sich den Maximalwert, der vom Startpunkt aus erreicht werden kann
visited[start_y][start_x] = -1

Nur hier. Dies gibt die längste Entfernung von jedem Startpunkt zurück.

Recommended Posts

Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (024 --027 Suche nach Tiefenprioritäten)
Lösen Sie mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (015 --017 Vollständige Suche: Vollständige Suche weiterleiten)
Löse mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (010 --014 Vollständige Suche: Bit vollständige Suche)
Lösen Sie mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (001 - 004 Alle suchen: Alle Aufzählungen)
Lösen mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (053 --055 Dynamische Planungsmethode: Andere)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (056 - 059 Problem mit der kürzesten Route: Dyxtra-Methode)
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 7/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 4/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 3/22].
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 1/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 6/22]
Lösen Sie mit Python [100 ausgewählte Fragen aus der Vergangenheit, die Anfänger und Fortgeschrittene lösen sollten] (005 --- 009 Alle Suche: Alle Aufzählungen, um die Anzahl der Straßen durch Entwickeln zu reduzieren)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (034-038 Dynamische Planungsmethode: Knapsack DP basic)
Lösen Sie mit Python [100 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (039 - 045 Dynamische Planungsmethode: Knapsack DP-Variante)
Kausales Denken und kausale Suche von Python (für Anfänger)
1. Algorithmus Praktischer Test Lösen Sie frühere Fragen mit Python
[Python] Suche nach Tiefenpriorität und Suche nach Breitenpriorität
2. Algorithmus Praktischer Test Löse vergangene Fragen mit Python (unvollendet)
Suchen und laden Sie YouTube-Videos automatisch mit Python herunter
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part1 durchsuchen kann
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part2 durchsuchen kann
[Für Anfänger von Wettkampfprofis] Ich habe versucht, 40 AOJ "ITP I" -Fragen mit Python zu lösen
Lösen Sie simultane normale Differentialgleichungen mit Python und SymPy.
Implementieren Sie die Suche nach Tiefenpriorität (DFS) und die Suche nach Breitenpriorität (BFS) in Python
Sequentielle Suche mit Python
Löse AtCoder 167 mit Python
Löse Mathe mit Python
Dichotomie mit Python
Dichotomie mit Python 3
Löse POJ 2386 mit Python
Lösen mit Ruby und Python AtCoder ABC151 D Suche nach Breitenpriorität
Lösen mit Ruby und Python AtCoder ABC133 D Kumulative Summe
Lösen Sie AtCoder-Probleme Bootcamp für Anfänger (Medium 100) mit Python
Zusammenfassung der Module, die die Installation von WebDriver mit Python automatisieren und unterstützen