UnionFind Tree ist der Standard, aber Anfänger sollten zuerst DFS beherrschen. Verwenden Sie keine rekursiven Funktionen für einfache Operationen.
Referenz ABC 157 D Sanfter Kommentar zum Problem
Beispielcode
N, M, K = map(int, input().split())
F = [[] for _ in range(N)]
B = [[] for _ in range(N)]
#Angrenzende Freundesliste
for _ in range(M):
    a, b = map(int, input().split())
    a, b = a - 1, b - 1
    F[a].append(b)
    F[b].append(a)
#Benachbarte Liste von Blöcken
for _ in range(K):
    c, d = map(int, input().split())
    c, d = c - 1, d - 1
    B[c].append(d)
    B[d].append(c)
#Freundschaftsgruppe (Wörterbuchtyp)
D = {}
#Gruppenelternteil
parent = [-1] * N
#Besuchen Sie das Management
visited = [False] * N
for root in range(N):
    if visited[root]:
        continue
    D[root] = set([root])
    #Besuchter Stapel
    stack = [root]
    #Bis es keine Orte mehr zu besuchen gibt
    while stack:
        #Pop-up-Besucher
        n = stack.pop()
        #Besuchter Besucher
        visited[n] = True
        #Stellen Sie die Eltern für eine Gruppe von Besuchern ein
        parent[n] = root
        #Fügen Sie Root-Freunde zu Gruppen und Zielen hinzu
        for to in F[n]:
            if visited[to]:
                continue
            D[root].add(to)
            stack.append(to)
ans = [0] * N
for iam in range(N):
    #Richten Sie Ihre eigene Freundschaftsgruppe ein
    group = D[parent[iam]]
    #Entfernen Sie Freunde und sich selbst aus der Gruppe
    tmp_ans = len(group) - len(F[iam]) - 1
    #Blöcke aus der Gruppe entfernen
    for block in B[iam]:
        if block in group:
            tmp_ans -= 1
    ans[iam] = tmp_ans
print(*ans, sep=' ')
Recommended Posts