ABC 157 D - Lösungsvorschläge für Freunde in Python!

Das jüngste D-Problem ist aufgrund seiner Knochen oft unlösbar, und ich bin heutzutage traurig. Ich habe mich gefragt, wie ich es lösen soll, auch wenn es vorbei ist, also habe ich mein Bestes versucht, es zu lösen.

Das Schlüsselwort lautet diesmal __ "ungerichteter Graph" __ "verkettete Komponente" __. Die Punkte sind __ "DFS" __ und __ "set" __!

Link zum Problem ABC 157 D - Freundliche Vorschläge

Antworten während des Wettbewerbs

Ich bemerkte, dass es sich um ein ungerichtetes Diagramm handelte und entschied mich sofort, es mit DFS zu lösen. Verwenden Sie von jedem Scheitelpunkt aus DFS, um Punkte zu zählen, die weder Freunde noch Blöcke der verbundenen Komponenten sind. Ich dachte, es wäre nicht rechtzeitig für die Doppelschleife, aber es war TLE. Dies ist die Zeit während des Wettbewerbs.

from collections import deque

N,M,K = map(int,input().split())
friend = [list(map(int,input().split())) for _ in range(M)]
block = [list(map(int,input().split())) for _ in range(K)]

g = [[False]*(N+1) for _ in range(N+1)]
for i in friend:
    g[i[0]][i[1]] = True
    g[i[1]][i[0]] = True


b = [[False]*(N+1) for _ in range(N+1)]
for i in block:
    b[i[0]][i[1]] = True
    b[i[1]][i[0]] = True
    
stack=deque()
ans = []

for i in range(1,N+1):
    cnt = 0
    visited = [0] * (N+1)
    visited[i] = 1 
    stack.append(i)
    while stack:
        n = stack.pop()
        for j in range(1,N+1):
            if g[n][j] and visited[j]==0:
                stack.append(j)
                visited[j] = 1
                if g[i][j] == False and b[i][j]==False:
                    cnt+=1
    ans.append(cnt)
print(*ans)

Antworten nach dem Wettbewerb

Bei der Verwendung von in habe ich gehört, dass Set schneller als List ist, daher habe ich mich für die Verwendung entschieden. Als Ergebnis des Kampfes gegen TLE durch verschiedene Versuche und Irrtümer erhielt ich unten AC.

Sammeln Sie die Verknüpfungskomponenten in der Verknüpfung und suchen Sie die Verknüpfungskomponenten. Nach der Suche nach der Verknüpfungskomponente Sie wird berechnet, indem die Anzahl der Freund- und Blockbeziehungen subtrahiert wird, die für jeden Punkt der Verbindungskomponente gezeichnet werden sollen.

from collections import deque

N,M,K = map(int,input().split())
friend = [list(map(int,input().split())) for _ in range(M)]
block = [list(map(int,input().split())) for _ in range(K)]

f = [set() for _ in range(N+1)]
b = [set() for _ in range(N+1)]

for i,j in friend:
    f[i].add(j)
    f[j].add(i)
for i,j in block:
    b[i].add(j)
    b[j].add(i)

stack=deque()
ans = [0]*(N+1)
visited = [0]*(N+1)

for i in range(1,N+1):
    if visited[i]:
        continue
    link = {i}
    visited[i] = 1 
    stack.append(i)
    while stack:
        n = stack.pop()
        for j in f[n]:
            if visited[j]==0:
                stack.append(j)
                visited[j] = 1
                link.add(j)
    for i in link:
        ans[i] = len(link) - len(link & f[i]) - len(link & b[i]) - 1
print(*ans[1:])

Einfallsreichtum

Da es offensichtlich nutzlos ist, die Suche zu überprüfen, habe ich hinzugefügt, die Suche nicht zu suchen.

if visited[i]:
    continue

Ich habe überprüft, ob alle Eckpunkte für einen bestimmten Punkt Freunde waren. Ich habe mich geändert, um nur nach denen zu suchen, die mit diesem Punkt befreundet sind.

for j in range(1,N+1):
# ↓↓↓
for j in f[n]:

Ich habe eine Möglichkeit entwickelt, die Anzahl der Freundschaften oder Blockbeziehungen von der Größe der Verknüpfungskomponente zu subtrahieren.

ans[i] = len(link) - len(link & f[i]) - len(link & b[i]) - 1

Mit anderen Worten, was bedeutet das ... Unter Verwendung des Produktsatzes wird die Anzahl der Freund- und Blockbeziehungen aus den verbundenen Komponenten berechnet.

f = [set for _ in range(10)]
b = [set for _ in range(10)]

#Verbindungskomponente
link = {1,2,4,9,10}
#1 und 4/10 sind Freunde
f[1] = {4,10}
#1 blockiert 5/6/9
b[1] = {5,6,9}

print(link&f[1], link&b[1])
print(len(link&f[1]), len(link&b[1]))
{10, 4} {9}
2 1

Recommended Posts

ABC 157 D - Lösungsvorschläge für Freunde in Python!
Löse ABC175 D in Python
Löse ABC169 mit Python
Löse ABC165 A, B, D mit Python
Löse ABC176 E in Python
Löse ABC166 A ~ D mit Python
Löse den Atcoder ABC169 A-D mit Python
Löse ABC036 A ~ C mit Python
Löse ABC037 A ~ C mit Python
Löse ABC175 A, B, C mit Python
Ich wollte ABC159 mit Python lösen
Löse AtCoder ABC168 mit Python (A ~ D)
Löse ABC168D in Python
Löse ABC167-D mit Python
Löse ABC146-C mit Python
Löse ABC098-C in Python
Löse ABC159-D in Python
Löse ABC160-E mit Python
Löse Addition (entspricht Paiza Rang D) in Python
Löse AtCoder ABC166 mit Python
Atcoder ABC164 A-C in Python
Löse die Multiplikation (entspricht Paiza Rang D) in Python
Atcoder ABC167 A-D in Python
Löse Wooldridge-Übungen in Python
Atcoder ABC165 A-D in Python
Atcoder ABC166 A-E in Python
AtCoder ABC 182 Python (A ~ D)
Löse den Atcoder ABC176 (A, B, C, E) in Python
Lösen Sie Optimierungsprobleme mit Python
Atcoder ABC169 A-E in Python
AtCoder ABC177 A-D mit Python
Lösen der Nummernsortierung (entspricht Paiza Rang D) in Python
Lösen mit Ruby und Python AtCoder ABC133 D Kumulative Summe
Löse Charakter-Übereinstimmungen (entspricht Paiza-Rang D) in Python
AtCoder ABC151 Problem D Geschwindigkeitsvergleich in C ++ / Python / PyPy
Löse ABC163 A ~ C mit Python
ABC166 in Python A ~ C Problem
Löse ABC168 A ~ C mit Python
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Lösen Sie normale Differentialgleichungen in Python
Lösen in Ruby, Python und Java AtCoder ABC141 D Priority Queue
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Löse den kleinsten Wert in Python (entspricht Paiza Rang D)
[Python, Julia] 3D-Anzeige in der Jupyter-Mayavi-Bibliothek
Algorithmus in Python (ABC 146 C Dichotomie
Ich wollte ABC160 mit Python lösen
[AtCoder] Löse ABC1 ~ 100 Ein Problem mit Python
Verwenden Sie \ d nicht in regulären Python 3-Ausdrücken!
Lösen Sie das maximale Subarray-Problem in Python
Ich wollte ABC172 mit Python lösen
Anfänger ABC154 (Python)
Quadtree in Python --2
Python in der Optimierung
CURL in Python
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python