[Python] [BFS] Beim Coder-Anfängerwettbewerb 168-D [.. Double Dots]

Problemstellung (.. Double Dots)

ABC168-D Double Dots

Irgendwo gibt es eine Höhle. Die Höhle hat N Räume und M Durchgänge, die Räume sind von 1 bis N und die Durchgänge von 1 bis M nummeriert. Passage I verbindet Raum Ai und Raum Bi in beide Richtungen. Sie können zwischen den beiden Räumen durch mehrere Passagen hin und her gehen. Raum 1 ist ein spezieller Raum mit Höhleneingang. Da das Innere der Höhle dunkel ist, habe ich beschlossen, für jeden Raum außer Raum 1 einen Führer bereitzustellen. Der Pfad für jeden Raum sollte auf einen der Räume zeigen, der durch einen Gehweg direkt mit diesem Raum verbunden ist. Da das Innere der Höhle gefährlich ist, besteht das Ziel darin, die folgenden Bedingungen für alle Räume außer Raum 1 zu erfüllen. Wenn Sie von diesem Raum aus beginnen und wiederholen: "Sehen Sie sich das Straßenschild in dem Raum an, in dem Sie sich befinden, und gehen Sie zu dem Raum, auf den es zeigt". Gehe mit der geringsten Anzahl von Zügen zu Raum 1. Bestimmen Sie, ob es eine Anordnung von Pfaden gibt, mit denen Sie Ihr Ziel erreichen können, und geben Sie in diesem Fall eine solche Anordnung aus.

Antworten

from collections import deque

mi = lambda:list(map(int,input().split()))
mix = lambda x:list(mi() for _ in range(x))
##########
def main(n,m,l):
    #Erstellen eines Diagramms
    g = creategraph(n,l)
    #NG, wenn es einen separaten Raum gibt
    for i in range(1,len(g)):
        if len(g[i]) == 0:
            print("No")
            return
    #Erstellen Sie einen Leitfaden mit BFS
    navi = bfs(n,g)
    #NG, wenn die Richtlinie des Raums mit Ausnahme von Raum 1 nicht aktualisiert wird
    if min(navi[2:]) == 0:
        print("No")
    else:
        print("Yes")
        for i in navi[2:]:
            print(i)
    
#Suche nach BFS-Breitenpriorität
def bfs(n,g):
    navi = [0]*(n+1)
    navi[1] = -1
    q = deque()
    q.append(1)
    while len(q) > 0:
        #Nehmen Sie Ihren aktuellen Standort aus der Warteschlange
        cp = q.popleft()
        #Holen Sie sich eine Liste benachbarter Punkte an Ihrem aktuellen Standort
        np = g[cp]
        #Wenn der benachbarte Punkt nicht durchsucht wird, stellen Sie ihn in die Warteschlange und aktualisieren Sie die Richtlinie
        for i in np:
            if navi[i] == 0:
                navi[i] = cp
                q.append(i)
    return navi
    
#
def creategraph(n,l):
    g = {i:[] for i in range(n+1)}
    for a,b in l:
        g[a].append(b)
        g[b].append(a)
    return g

def resolve():
    n,m = mi()
    l = mix(m)
    main(n,m,l)

if __name__ == "__main__":
    resolve()

Recommended Posts

[Python] [BFS] Beim Coder-Anfängerwettbewerb 168-D [.. Double Dots]
[At Coder] Anfängerwettbewerb 175 Einführung in die ABCD-Python-Lösung
AtCoder Anfängerwettbewerb: D Problemantworten Python
[Python] Competitive Pro-Vorlage [At Coder]
Atcoder Anfänger Wettbewerb 152 Kiroku (Python)
[Wettkampfpraxis] Ich habe den AtCoder Beginner Contest 175 (A ~ C) ausprobiert.
[At Coder] ABC085C - Otoshidamas Python-Antwort
AtCoder Anfängerwettbewerb 174 C Problem (Python)
Löse den AtCoder-Anfängerwettbewerb 170 D - Nicht teilbar (ABC170D) mit Python (Eratostenes-Sieb)
Bei Coder (2020/09/08)
[Python] ABC133B (Problem mit dem oberen rechten Dreieck) [At Coder]
AtCoder Beginner Contest 169, D. Div Spiel-Funktionscode
Löse A ~ D des Yuki-Codierers 247 mit Python
[Python] ABC159D (High School Mathematics nCr) [Bei Coder]
Löse den AtCoder-Anfängerwettbewerb159 D - Verbotenes K (ABC159D) mit Python (Anzahl ist zu langsam!)