以下の問題において、深さ優先探索を再帰関数を使わずに実装する方法を教えてください。
再帰関数を使った実装で正解はできるのですが、再帰関数を使わない実装がうまくいきません。具体的には探索の順番が深さ優先探索ではないのです。
問題
多重辺・自己ループのない無向グラフを構成する 1 〜 N の番号がつけられた頂点とそれらを結ぶ M 本の辺の情報と、頂点番号 X が与えられます。
頂点 X から次のルールにしたがって深さ優先探索を行った時に訪れる頂点番号を順に出力してください。
- 現在の頂点に隣接する頂点のうち、未訪問かつ頂点番号が一番小さい頂点を探索する。
入力
N M X a_1 b_1 ... a_M b_M
- 1 行目では、頂点の数 N と辺の本数 M, 頂点番号 X が半角スペース区切りで与えられます。
- 続く M 行では、M 個の辺の両端の頂点の番号 a_i, b_i (1 ≦ i ≦ M) が与えられます。
出力
頂点 X から深さ優先探索を行った時に訪れる頂点の番号を順に改行区切りで出力してください。
制限
- 1 ≦ N ≦ 5,000
- 1 ≦ M ≦ min(N*(N-1)/2, 100,000)
- 1 ≦ X ≦ N
- 1 ≦ a_i, b_i ≦ N (1 ≦ i ≦ M)
- a_i ≠ b_i (1 ≦ i ≦ M)
入力例1
5 6 1 1 2 2 3 2 4 3 5 4 5 1 5
出力例1
1 2 3 5 4
自分の解答
Python
1from collections import deque 2n, m, x = map(int, input().split()) 3graph = [[] for _ in range(n)] 4 5# 隣接リストの作成 6for _ in range(m): 7 a, b = map(int, input().split()) 8 a -= 1 9 b -= 1 10 graph[a].append(b) 11 graph[b].append(a) 12 13# グラフの各ノードを昇順にする 14graph = [sorted(g) for g in graph] 15 16# 訪問済み確認リスト 17x -= 1 18visited = [False] * n 19visited[x] = True 20 21# スタックを使う 22Q = deque([x]) 23while Q: 24 now_node = Q.pop() 25 print(now_node + 1) 26 for next_node in graph[now_node]: 27 if visited[next_node] is False: 28 visited[next_node] = True 29 Q.append(next_node)
自分の解答を使った入力と出力
入力
5 6 1 1 2 2 3 2 4 3 5 4 5 1 5
出力 (誤り)
1 5 4 3 2

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/25 05:15