前提・実現したいこと
この記事で紹介されている,グラフをDFSで走査し,行きがけ順と帰りがけ順の順序を出力するc++のコードをPythonに翻訳しようとしています.
理想
記事では,次のようなコードで,
cpp
1#include <iostream> 2#include <vector> 3using namespace std; 4using Graph = vector<vector<int>>; 5 6vector<bool> seen; 7vector<int> first_order; // 行きがけ順 8vector<int> last_order; // 帰りがけ順 9 10void dfs(const Graph &G, int v, int& first_ptr, int& last_ptr) { 11 // 行きがけ順をインクリメントしながらメモ 12 first_order[v] = first_ptr++; 13 14 seen[v] = true; 15 for (auto next_v : G[v]) { 16 if (seen[next_v]) continue; 17 dfs(G, next_v, first_ptr, last_ptr); 18 } 19 20 // 帰りがけ順をインクリメントしながらメモ 21 last_order[v] = last_ptr++; 22} 23 24int main() { 25 // 頂点数と辺数 26 int N, M; cin >> N >> M; 27 28 // グラフ入力受取 (ここでは無向グラフを想定) 29 Graph G(N); 30 for (int i = 0; i < M; ++i) { 31 int a, b; 32 cin >> a >> b; 33 G[a].push_back(b); 34 G[b].push_back(a); 35 } 36 37 // 頂点 0 をスタートとした探索 38 seen.assign(N, false); // 全頂点を「未訪問」に初期化 39 first_order.resize(N); 40 last_order.resize(N); 41 int first_ptr = 0, last_ptr = 0; 42 dfs(G, 0, first_ptr, last_ptr); 43 44 // 各頂点 v の行きがけ順、帰りがけ順を出力 45 for (int v = 0; v < N; ++v) 46 cout << v << ": " << first_order[v] << ", " << last_order[v] << endl; 47}
次のような出力が返るようになっています.
c++
10: 0, 14 21: 1, 2 32: 2, 0 43: 3, 1 54: 4, 9 65: 5, 5 76: 6, 3 87: 7, 4 98: 8, 8 109: 9, 6 1110: 10, 7 1211: 11, 13 1312: 12, 10 1413: 13, 12 1514: 14, 11
これをそのままPythonに翻訳することが理想です.
発生している問題
翻訳するつもりで,次のように書きました.
Python
1 2N, M = map(int, input().split()) # 頂点数,辺数 3G = [[] for _ in range(N)] 4 5for i in range(M): 6 a, b = map(int, input().split()) 7 G[a].append(b) 8 G[b].append(a) 9 10seen = [False]*N 11first_order = [0]*N 12last_order = [0]*N 13first_ptr = 0 14last_ptr = 0 15 16 17def dfs(G, v, first_ptr, last_ptr): 18 19 first_ptr += 1 20 first_order[v] = first_ptr 21 22 seen[v] = True 23 24 for next_v in G[v]: 25 if seen[next_v]: 26 continue 27 dfs(G, next_v, first_ptr, last_ptr) 28 29 last_ptr += 1 30 last_order[v] = last_ptr 31 32 33dfs(G, 0, first_ptr, last_ptr) 34 35for v in range(N): 36 print('{}: {}, {}'.format(v, first_order[v], last_order[v])) 37
しかしその結果返ってくる出力は次のもので,想定と異なっています.
python
10: 1, 1 21: 2, 1 32: 3, 1 43: 3, 1 54: 2, 1 65: 3, 1 76: 4, 1 87: 4, 1 98: 3, 1 109: 4, 1 1110: 4, 1 1211: 2, 1 1312: 3, 1 1413: 3, 1 1514: 4, 1
どのように変更すれば想定通りの出力が得られるのでしょうか?
インクリメントがうまくいっていないことは明らかなのですが,なぜそうなのかの見当がつきませんでした.初歩的な質問で恐縮ですが,ご検討いただけると大変助かります.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/13 05:38