Official
C - 洞窟探検 / Cave Exploration Editorial
by
C - 洞窟探検 / Cave Exploration Editorial
by
harurun4635
問題文を丁寧によむと、おおよそ DFS の話をしています。注意するべきは
- 今いる頂点と同じであれば遷移しないこと
- 辺には適切に優先順位がついていること
です。
それらに注意して DFS を実装すれば AC することができます。
計算量について不安になるかもしれませんが、ふつうの DFS と同様に、「一度訪れた頂点は、その瞬間に 訪問済み となり、 \(2\) 回以上訪れることはない」という事実に注意すれば、各辺は高々 \(1\) 回しか訪問しないため \(O(N + M)\) になります。
実装例
import sys
sys.setrecursionlimit(400000)
n, m = map(int, input().split())
c = list(map(int, input().split()))
e = [[] for i in range(n)]
for i in range(m):
u, v = map(int, input().split())
u -= 1
v -= 1
e[u].append(v)
seen = [0] * n
def dfs(u):
seen[u] = 1
for v in e[u]:
if seen[v]: continue
if c[u] == c[v]: continue
if c[u] != c[v]:
dfs(v)
dfs(0)
if seen.count(0) == 0:
print("COMPLETE")
else:
print(*[x+1 for x in range(n) if seen[x] == 0])