Class で DFS

DFSを毎回自力で実装するのがめんどくさいのでAtcoder のKiの問題をclassで実装したのでメモとして残します

以下 利用したコード

N,Q = map(int,input().split())
Graph = [[]for _ in range(N)]
operater = []
for _ in range(N-1):
a,b = map(int,input().split())
Graph[a-1].append(b-1)
Graph[b-1].append(a-1)
from collections import deque
q = deque()
q.append(0)
seen = [False for _ in range(N)]
parent = [[] for _ in range(N)]#i番目の値はi-1頂点の親のリスト
while q:
now = q.popleft()#int
seen[now] = True
next = Graph[now]#list
for ver in next:
if seen[ver] == False:
q.appendleft(ver)
parent[ver].append(now)#深さ優先探索で親を求めた
counter = [0 for _ in range(N)]
class DFS:
def __init__(self,N,Graph,parent,counter):
self.seen = [False for _ in range(N)]
self.delete = []
def children (self,st):#自分を含む子をすべて返す
self.ans = []
for i in parent[st]:
self.seen[i] = True
self.delete.append(i)
from collections import deque
q = deque()
q.append(st)
while q:
now = q.popleft() # int
self.seen[now] = True
next = Graph[now] # list
for ver in next:
if self.seen[ver] == False:
q.appendleft(ver)
for i,j in enumerate(self.seen):
if j == True and i not in self.delete:
self.ans.append(i)
self.seen = [False for _ in range(N)]
self.delete = []
return self.ans
def count(self,p,x):
self.c = self.children(p)
for i in self.c:
counter[i] += x
return counter
#このクラスでは予め親リストをつくって渡していることに注意。いつか親リストをつくるところもクラスにします。