[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 6/22]

** Streben Sie einen hellblauen Codierer an! !! !! !! !! !! ** ** **

Damit [Richtlinien zur Verbesserung von AtCoder, einem von Red Coder gelehrten Wettbewerbsprofi [Zwischenausgabe: Ziel für hellblauen Coder! ]]( https://qiita.com/e869120/items/eb50fdaece12be418faa#2-3-%E5%88%86%E9%87%8E%E5%88%A5%E5%88%9D%E4%B8%AD%E7 % B4% 9A% E8% 80% 85% E3% 81% 8C% E8% A7% A3% E3% 81% 8F% E3% 81% B9% E3% 81% 8D% E9% 81% 8E% E5% 8E % BB% E5% 95% 8F% E7% B2% BE% E9% 81% B8-100-% E5% 95% 8F) (@ e869120)

AtCoder hat 100 gute pädagogische Fragen gesammelt, die für braune und grüne Codierer geeignet sind, um mit einer kleinen Anzahl von Fragen einen hellblauen Codierer oder eine Bewertung von 1200 zu erreichen.

Die 100 früheren Fragen dieses Artikels, die Anfänger und Fortgeschrittene lösen sollten Wird mit ** Python ** gelöst! Vielen Dank an @ e869120! !! !! !! !! !!

Link zum letzten Artikel

** Alle durchsuchen: Alle auflisten ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 1/22] ** Vollständige Suche: Alle Aufzählungen zur Reduzierung der Anzahl der Straßen durch Ausarbeitung ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part2 / 22] ** Vollständige Suche: Bit vollständige Suche ** [[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil3 / 22]] (https://qiita.com/rudorufu1981/items/74d5f37c26c62fc7a27f) ** Vollständige Suche: Vollständige Suche weiterleiten ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part4 / 22] ** Halbierungssuche ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part5 / 22] ** Suche nach Tiefenpriorität ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part6 / 22] ** Suche nach Breitenpriorität ** [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Part7 / 22]

"Teil 6" ~ Tiefenprioritätssuche (DFS) ~

Wir werden die folgenden 4 Fragen lösen!

Tiefenprioritätssuche

24 ALDS_11_B - Tiefe Prioritätssuche Dies ist ein Grundproblem. 25 AOJ 1160-Wie viele Inseln gibt es? Die Anzahl der verbundenen Komponenten im Diagramm kann durch Suche nach Tiefenpriorität berechnet werden. 26 AtCoder-Anfängerwettbewerb 138 D - Ki Viele Baumstrukturprobleme verwenden die Suche nach Tiefenprioritäten. 27 JOI 2009 Qualifizieren der 4-dünnen Eisüberquerung Die Suche nach Tiefenprioritäten ist nicht nur eine Baumstruktur, sondern ein Problem, das uns sagt. Es kann mit einer rekursiven Funktion gelöst werden.

DFS-Voraussetzungen

・ Ich werde einen Artikel schreiben, der auf den folgenden drei Punkten basiert! ** ① Über Stapel und Warteschlangen ** Zunächst Kenchos Artikel Master-Stapel und Warteschlangen! ~ Besonderheit bei Ideen und Verwendungen ~ Lesen Sie mehr über ** Atmosphäre über Stapel und Warteschlangen! ** ** **

** ② Über DFS und Grafik ** Ein weiterer Artikel von Kencho DFS (Depth Priority Search) Super Einführung! ~ Einstieg in die Welt der Graph-Algorithmen ~ [Teil 1] DFS (Depth Priority Search) Super Einführung! ~ Einstieg in die Welt der Graph-Algorithmen ~ [Teil 2] Lesen Sie mehr über DFS und Grafiken ** Verstehen Sie die Atmosphäre! ** ** **

** ③ Danach, wie man DFS in Python implementiert ** Wie Die folgenden Sites waren leicht zu verstehen, also diese beiden Sites ** ◆ Für gewöhnliche Grafiken oder Bäume ** Algorithmus in Python (Tiefenprioritätssuche, dfs) ** ◆ Für Rasterdiagramm ** Implementieren der Tiefenprioritätssuche (DFS) in Python-ATC001 ** Vorsichtig ** Lesen Sie mehr über DFS und Grafiken **! ** ** **

Wenn Sie die Prämisse von ①②③ haben, können Sie es lernen, indem Sie tatsächlich Ihre Hände bewegen! !! !!

24 ALDS_11_B - Suche nach tiefer Priorität

Typisches Grafikproblem!

graph = {i:collections.deque() for i in range(1,N+1)} Oder graph = {i:[] for i in range(1,N+1)} ** Dies ist die Grafikvorlage! ** ** **

Ich habe DFS zum ersten Mal implementiert. Als ich es gemäß der obigen Seite implementiert habe ** habe ich es geschafft, es zu implementieren! ** ** ** Der Code ist lang, aber ** die Schwierigkeit ist nicht so groß! !! !! ** ** **

Der Punkt sind diese beiden Linien! !! !!

seen[j] = 1
stack.append(j)
seen[g_NO] = 1
stack.append(g_NO)

~ Wie man sich erinnert ~ ① ** Ich habe die Haushälterin gesehen! ** (Drama), also Ändern Sie "gesehen" in "0 (falsch)" → "1 (wahr)"! ② Wenn Sie die Haushälterin sehen, legen Sie sie auf Lager! !! !! ** (Die Haushälterin hat den Müll gesehen, also habe ich ihn in den Mülleimer gelegt !!!) **

Wenn Sie dieses Bild im Sinn haben, können Sie zum Zeitpunkt der Implementierung Code mit Hirntod schreiben!

test.py


import collections,sys
def I(): return int(sys.stdin.readline().rstrip())
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
n = I()
ukv = [LI() for _ in range(n)]
graph = {i:collections.deque() for i in range(1,n+1)} #1_indexed
for x in ukv:
    u,k,*v = x
    for y in v:
        graph[u].append(y)
seen = [0]*(n+1) #1_indexed
stack = []
time = 0
seentime = [0]*(n+1) #1_indexed
donetime = [0]*(n+1) #1_indexed
def dfs(j):
    global time
    seen[j] = 1
    stack.append(j)
    time += 1
    seentime[j] = time
    while stack:
        s = stack[-1]
        if not graph[s]:
            stack.pop()
            time += 1
            donetime[s] = time
            continue
        g_NO = graph[s].popleft()
        if seen[g_NO]:
            continue
        seen[g_NO] = 1
        stack.append(g_NO)
        time += 1
        seentime[g_NO] = time
for j in range(1,n+1):
    if seen[j]:
        continue
    dfs(j)
for k,a,b in zip(range(1,n+1),seentime[1:],donetime[1:]):
    print(k,a,b)

Ich muss nicht "def dfs ()" schreiben, aber ich habe versucht, es "def" zu machen, damit es mit der Beschreibung von DFS leicht zu verstehen ist!

Auch das Grafikproblem Ich denke, die meiste Zeit beginnt es mit "1" anstelle von "0". Vereinheitlichen Sie den gesamten Code mit 1_indexed!

Ich habe auch zum ersten Mal versucht, "global" zu verwenden, aber ich verstehe! Es fühlt sich an wie!

Eine andere Sache, die mir beim Schreiben des Codes bewusst war ** Ich habe so oft wie möglich "Weiter" verwendet, um zu verhindern, dass Code unter den Bedingungen ausgeführt wird, um die Lesbarkeit zu verbessern! ** ** ** DFS ist besonders tief verschachtelt! (= Neigt dazu, kompliziert zu sein = Einfach, Fehler zu erstellen!)

** Die Haushälterin sah! (Zweites Mal)**

25 AOJ 1160-Wie viele Inseln gibt es?

Typisches Rasterdiagrammproblem! Das Problem und die Denkweise eines normalen Graphen sind gleich! Ich habe auf die obige Seite verwiesen, aber ** ich war überrascht! ** ** ** ** Die Haushälterin sah! (Drittes Mal)**

test.py


import collections,itertools,sys
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
while 1:
    w,h = LI()
    if w==h==0:
        break
    ans = 0
    c = [LI() for _ in range(h)]
    seen = [[0]*w for _ in range(h)]
    stack = []
    dhdw = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
    def dfs(H,W):
        seen[H][W] = 1
        stack.append([H,W])
        while stack:
            sh,sw = stack.pop()
            for dh,dw in dhdw:
                nh,nw = sh+dh,sw+dw
                if not(0<=nh<=h-1) or not(0<=nw<=w-1) or seen[nh][nw] or c[nh][nw]==0:
                    continue
                seen[nh][nw] = 1
                stack.append([nh,nw])
    for H,W in itertools.product(range(h),range(w)):
        if seen[H][W] or c[H][W]==0:
            continue
        ans += 1
        dfs(H,W)
    print(ans)

26 AtCoder Beginner Contest 138 D - Ki Difficulty:923 ** Ich konnte es auf den ersten Blick nicht lösen! !! !! ** ** ** Ich stolperte über den Rechenaufwand und über die Idee der Wurzeln! Von nun an wird es jedoch einen ** "Baum" ** geben, der ähnliche Probleme lösen kann! !! !!

Diese beiden Punkte!

Alle Eckpunkte unterhalb der Wurzel fühlen sich an, als würden Sie Referenzwurzelpunkte ~ hinzufügen Wenn Sie nicht AC geworden sind, lesen Sie bitte diesen Artikel! !! !! AtCoder Beginner Contest 138 D - Die Testfälle von Ki nehmen nach dem Wettbewerb zu (modifizierte Version)

** Die Haushälterin sah! (4.) **

test.py


import collections,sys
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
N,Q = LI()
ab = [LI() for _ in [None]*(N-1)]
px = [LI() for _ in [None]*(Q)]
ans = [0]*(N+1) #1_indexed
graph = {i:collections.deque() for i in range(1,N+1)} #1_indexed
for a,b in ab:
        graph[a].append(b)
        graph[b].append(a)
for p,x in px:
    ans[p] += x
seen = [0]*(N+1) #1_indexed
stack = []
def dfs():
    seen[1] = 1
    stack.append(1)
    while stack:
        s = stack.pop()
        if not graph[s]:
            continue
        for j in range(len(graph[s])):
            g_NO = graph[s].popleft()
            if seen[g_NO]:
                continue
            seen[g_NO] = 1
            stack.append(g_NO)
            ans[g_NO] += ans[s]
dfs()
print(*ans[1:])

Apropos, Beschrieben in Anhang 2 am Anfang

Geben Sie aus diesem Artikel (** Teil 6 **) input()sys.stdin.readline().rstrip() Ich wechsle zu!

Die Ursache hierfür ist dieses Problem w

Ich hatte Probleme mit TLE, aber als ich den Code von jemandem sah, der das konnte, sys.stdin.readline() Ich benutze ... Als ich es vorerst versuchte, war ich überrascht, dass es eine Klimaanlage wurde! Bei der Untersuchung stellt sich heraus, dass ** input () extrem langsam ist! !! !! ** ** ** Referenzartikel 8 kleine Unterschiede in der Verarbeitungsgeschwindigkeit, die Python kennen sollte

Der Code kann hinsichtlich des Rechenaufwands verbessert werden. (Zum Beispiel, wenn Sie "ab" oder "px" erhalten) Es ist AC, also nein ~

27 JOI 2009 Qualifying 4-Thin Ice Crossing

** Ich konnte das auch nicht auf den ersten Blick lösen! !! !! ** ** **

Auf keinen Fall ** Ich habe die Haushälterin gesehen! Das Problem, dass (gesehen) ** nicht verwendet werden kann! !! !! Frühere Artikel [Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil3 / 22] Das Teilsummenproblem von ist auch ein Problem, das von der DFS gelöst werden kann. ** Die Haushälterin sah! Wenn (gesehen) ** nicht verfügbar ist **, hat die Haushälterin gesehen! Der Schwierigkeitsgrad ist höher, weil Sie über etwas nachdenken müssen, das sich in (gesehen) ** ändert!

** Sie müssen viele schwierige Probleme lösen und sich daran gewöhnen! ** ** **

test.py


import itertools,sys
def I(): return int(sys.stdin.readline().rstrip())
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
m = I()
n = I()
area = [LI() for _ in range(n)]
ans = 0
dndm = [[1,0],[-1,0],[0,1],[0,-1]]
stack = [] #Position zum Zeitpunkt des Stapelns, Vergangenheit
def dfs(i,j):
    global ans
    stack.append([[i,j],set()])
    while stack:
        [sn,sm],history = stack.pop()
        ans = max(ans,len(history))
        for dn,dm in dndm:
            nn,nm = sn+dn,sm+dm
            if not(0<=nn<=n-1) or not(0<=nm<=m-1) or area[nn][nm]==0 or ((nn,nm) in history):
                continue
            stack.append([[nn,nm],history | {(nn,nm)}])
for i,j in itertools.product(range(n),range(m)):
    if area[i][j]==1:
        dfs(i,j)
print(ans)
history | {(nn,nm)}

von | ist ein Summensatz! (Auch ein Bitoperator ODER) Ebenfalls, & ist das Produktset! (Auch ein Bitoperator AND) ^ Ist eine Menge von beidem`! (Auch ein Bitoperator XOR)

Nächstes Mal werde ich die folgenden 6 Fragen lösen!

Suche nach Breitenpriorität

28 ALDS_11_C - Breite Prioritätssuche Dies ist ein grundlegendes Problem. 29 AtCoder-Anfängerwettbewerb 007 C - Suche nach Breite mit Priorität Das Problem der kürzesten Route bei ungewichteten Diagrammen kann durch Suche nach Breite und Priorität gelöst werden. 30 JOI 2011 Qualifying 5-Cheese 31 JOI 2012 Qualifying 5-Illumination Die Implementierung ist etwas schwer, aber wenn Sie Ihr Bestes geben, können Sie sie lösen. 32 AOJ 1166 - Die Implementierung ist etwas schwer. 33 AtCoder Anfängerwettbewerb 088 D --Grid Repainting Wenn dies behoben ist, können Sie denken, dass Sie an die Suche nach Breitenprioritäten gewöhnt sind.

Part6/22 Ende!

Weiter (Teil 7/22)

Recommended Posts

[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 5/22]
[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 frühere Fragen, die Anfänger und Fortgeschrittene lösen sollten] (028 - 033 Suche nach Breitenpriorität)
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] (024 --027 Suche nach Tiefenprioritäten)
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 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)
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)
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)
[Für Anfänger von Wettkampfprofis] Ich habe versucht, 40 AOJ "ITP I" -Fragen mit Python zu lösen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, die Sprachen, die Anfänger von nun an lernen sollten, absichtlich zusammenzufassen
Tohoku University 2020 Early Mathematical Exam (Science) Ich habe versucht, die großen Fragen 1 bis 3 mit Python zu lösen
Ich habe versucht, Python zu berühren (Installation)
Python-Anfänger versuchten es herauszufinden
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
[Python] Ich habe versucht, Wörter, die für Anfänger schwer zu verstehen sind, auf leicht verständliche Weise zu erklären.
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Wie man offline in Echtzeit schreibt Ich habe versucht, E11 mit Python zu lösen
Ich habe versucht, PLSA in Python 2 zu implementieren
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich wollte ABC160 mit Python lösen
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, Optuna die Nummer lösen zu lassen
Ich habe versucht, einen Formatierer zu entwickeln, der Python-Protokolle in JSON ausgibt
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ich habe versucht, Kanas handschriftliche Zeichenerkennung durchzuführen. Teil 2/3 Datenerstellung und Lernen
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
10 Python-Fehler, die Anfängern häufig sind
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, AtCoders Depth Priority Search (DFS) in Python zu lösen (Ergebnis: TLE ...)
Ich habe versucht, TSP mit QAOA zu lösen
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
[Markov-Kette] Ich habe versucht, Zitate und negative Emotionen in Python einzulesen.
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich wollte ABC172 mit Python lösen
Ich überarbeitete "Ich habe versucht, Othello AI zu machen, als Programmieranfänger Python studierten"
Wie man offline in Echtzeit schreibt Ich habe versucht, E12 mit Python zu lösen
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.