[解決済み] グラフ理論 Matlab BFSアルゴリズム
2022-02-14 04:40:28
質問内容
隣接行列をBFSリストに変換する関数を書こうとしています。出力は2つの行を含み、1つはノードのインデックス、もう1つはノードを訪れる順序です。 Aは隣接行列であり、関数は次のようになります。
function [ forest ] = Find_BFS_forest( A )
例えば 入力 A を [0,1,0,0,1,0;1,0,1,0,0,0;0,1,0,0,0,0;0,0,0,0,0;1,0,0,0,0,0;0,0,0,0,0] とするとき。 edge_list は {(1,2) (1,5) (2,3)} である。出力は [1,2,5,3,4,6;0,1,1,2,0,0] のようにしたい。
n=length(A);
% vis to mark if a node is visited earlier or not
vis=zeros(n,1);
% pred to predecessor of each node
pred=zeros(n,1);
% path to store the bfs traversal
path =zeros(n,1); pp = 1;
for i = 1:n
% start bfs from each unvisited node i
if vis(i) == 0
% search queue and search queue tail/head
sq=zeros(n,1);
sqt=1;
sqh=0;
% push starting node in the queue
sq(sqt)=i;
while sqt-sqh>0
% pop v off the head of the queue
sqh=sqh+1;
v=sq(sqh);
path(pp) = v;
pp=pp+1;
for u=1:n
if A(v,u)==1 && vis(u)==0
% if u is connected to v and is unvisited push it to the queue
sqt=sqt+1;
sq(sqt)=u;
vis(u) = 1;
pred(u)= v;
end
end
end
end
end
% create the output forest
forest = zeros(2,n);
for i=1:n
forest(1,i) = path(i);
forest(2,i) = pred(path(i));
end
end
これは私が今持っているコードですが、ノードが繰り返されています。どこを変更すればいいのでしょうか?
ありがとうございました。
どのように解決するのですか?
各ツリーの初期ノードを
visited
:
for i = 1:n
% start bfs from each unvisited node i
if vis(i) == 0
vis(i) = 1; % mark initial node as visited <-- added
% search queue and search queue tail/head
...
追加後の出力。
forest =
1 2 5 3 4 6
0 1 1 2 0 0
関連
-
[解決済み] Matlabのfprintfを使用してテーブルを作成する
-
[解決済み] ある行列から固有ベクトルの異なる解を得ることができるでしょうか?
-
[解決済み] MATLABでベクトルからNaNを除去する
-
[解決済み] 単純論理条件フラグ MATLAB
-
[解決済み] mnrfitを用いたmatlabでのロジスティック回帰
-
[解決済み] 行列の行にノルム関数を適用する - Matlab [duplicate]
-
[解決済み] キュービックスプライン補間と多項式補間の比較
-
[解決済み] Matlabでのリッジ回帰とOLS回帰
-
[解決済み] MATLABで音を止めるには?
-
[解決済み] matlab のプロットベクトルは同じ長さでなければなりません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MATLABエラー "このコンテキストでは関数定義は許可されていません。" [重複しています]。
-
[解決済み] Matlabで列ベクトルを反復処理する方法は?[重複].
-
[解決済み] 部分ピボットによるガウス消去の実装【終了しました
-
[解決済み] Matlabのstrcat関数が空白を含んでいる場合のトラブル
-
[解決済み] MATLABでカラーバーのスケールを制御する
-
[解決済み] MATLABによるパワーメソッド
-
[解決済み] MATLABで分数を10進数に変換する【重複】。
-
[解決済み] Matlab Error: ポジション1のインデックスが配列の境界を越えています
-
[解決済み] matlabでchi2gof関数を理解する
-
[解決済み] Matlab - 収束率を計算する