88. 疑似言語
さて、疑似言語の説明は必要でしょうか?
簡単にですが先ほどの手順と関連付けます。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
89. 疑似言語
ここで、スタート地点のsをUに入れます。
図で言えばaの追加に対応します。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
90. 疑似言語
ループの条件ですが、
Vの中身すべてがUに追加されていないとき、
つまりU!=Vの時ですね。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
91. 疑似言語
これが黄色で囲んでいる集合Wとなります。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
92. 疑似言語
Wの中身すべてに対して…
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
93. 疑似言語
tmpを求めます。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
94. 疑似言語
補題よりこの式が
aからの暫定最小経路になりますね。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
95. 疑似言語
そして、tmpが最小となるものが
追加される頂点です。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
96. 疑似言語
aからの最短経路dを確定して、
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
97. 疑似言語
Uに追加します。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
98. 疑似言語
そして辺を追加します。
最短となる辺を追加すればいいわけです。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end
99. 疑似言語
ということで…
ループ条件まで繰り返せば完了です。
Input : G = (V, E), V上の頂点S
Output : s 始点とするGの最短経路木T
0 Tを初期化する;
1 ds ← 0; U <- {s};
2 while U != V do
3 | Uと隣接しているV-U中の頂点の集合をwとする;
4 | foreach u ∈ W do
5 | | tmp ← min v∈U { dv + C(v, u) };
6 | end
7 | Wの中で最小の暫定距離を持つ頂点uを選択する;
8 | du ← tmpuとし、uをUに追加する;
9 | tmpu = dw + c(w, u)なる頂点wを1つ選び、
頂点wと辺{w, u}をTに追加する;
10 end