Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
グラフを扱おう:
最短路問題
北海道大学 情報科学研究科
修士1年 栗田和宏
グラフの定義(数学)
グラフとは集合の組であり,G = (V, E)と

表される.ここで E ⊆ (V,V)である.
Vを頂点集合と呼び,Eを辺集合と呼ぶ.
グラフの表現法
グラフを表現する方法として2つ考えられる.
1. 隣接行列
2. 隣接リスト
グラフの表現法
グラフを表現する方法として2つ考えられる.
1. 隣接行列
2. 隣接リスト メモリ:小 検索:遅
メモリ:大 検索:速
隣接行列
グラフの各頂点間の隣接関係を行列で表す.
隣接行列
グラフの各頂点間の隣接関係を行列で表す.
0 1 0 1
1 0 1 1
0 1 0 0
1 1 0 0
1
2
3
4
隣接行列
隣接行列にはO(V2)のメモリとある2頂点間に辺が
あるかを検索するのにO(1)時間がかかる
隣接リスト
グラフの各頂点の隣接関係をリストで保持する.
1
2
3
4
1 2
31
23
24 1
2
4
4
隣接リスト
隣接リストにはO(V + E)のメモリとある2頂点間に
辺があるかを検索するのにO(E)時間がかかる.
単一始点最短路問題
単一始点最短路問題とは与えられた頂点sから他の
すべての頂点への最短路を求める問題である.
単一始点最短路問題
単一始点最短路問題とは与えられた頂点sから他の
すべての頂点への最短路を求める問題である.
ベルマンフォード法
ダイクストラ法
最短路の性質
最小コストの重要な性質として次のことが言える.
頂点uの最小コストは

uと隣接する頂点の最短路 + uへ移動するコスト

の最小である.
u
v0
v1
v2
s …..
3
5
1
1
3
ベルマンフォード法
1. 始点以外のコストをINFに,始点のコストを0に
する.
2. すべての辺を使い,コストを更新する
3. コストの更新ができなかったら終了,更新ができ
たら2に戻る.
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 INF INF INF INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 INF 10 INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 INF 10 INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8
0 1 6 5 13 INF 11 7
1
1
6
7
5
5
10
3
9
4
1 2 3 4 5 6 7 8 9
0 1 6 5 13 INF 11 7 IN...
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8
0 1 6 5 13 INF 11 7
1
1
6
7
5
5
10
3
9
4
1 2 3 4 5 6 7 8 9
0 1 6 5 13 INF 11 7 IN...
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 6 5 8 16 6 7 14
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 6 5 8 16 6 7 14
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 6 5 8 11 6 7 14
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 6 5 8 11 6 7 14
1
1
6
7
5
5
10
3
9
4 2
計算量
時間計算量:O(VE) もしくは O(V3)
空間計算量:O(E) もしくはO(V2)
時間計算量はグラフを隣接リストで持っておくと
O(VE)になり,隣接行列で持っておくとO(V3)と

なる.
コードの例:
ベルマンフォード法
https://github.com/kazu0423/procon_example/
blob/master/bellman_ford.cpp
計算量の解析
while文が入っていて,ぱっと見での計算量が

わかりづらい.
このwhile文は最大V - 1回のループをする 

→ なぜなら1回のループで少なくとも1つの頂点の
最短コストが決定するからである.
計算量の解析
while文中の計算量はすべての辺についての操作を
しているのでO(E)となる.
全体としてはO(VE)となる.
ダイクストラ法
ベルマンフォード法よりももっと高速に最短路を
求めるアルゴリズム.
仮定としてすべての辺のコストを非負とする.
ダイクストラ法
ベルマンフォード法よりももっと高速に最短路を
求めるアルゴリズム.
仮定としてすべての辺のコストを非負とする.
ベルマンフォード法では最小コストが決定してい
ない頂点に対しても更新をしていた.
このような更新は無駄である.
不要な更新
1
2
3
4
9
7
5
8
6
1
1
6
7
5
5
10
3
9
4
1 2 3 4 5 6 7 8 9
0 INF INF INF INF INF INF INF INF
2
不要な更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 INF 10 INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
不要な更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 INF 10 INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
なぜ不要か?
背理法で証明する.
仮定として現在最小コストが決まっていない頂点
の中でコスト最小の頂点がもっと小さいコストで
その頂点に行けると別のパスがあると仮定する.
そのようなパスは存在しないことが証明できる.
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 INF INF INF INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 INF 10 INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 INF 10 INF INF INF INF INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8
0 1 6 5 13 INF 11 7
1
1
6
7
5
5
10
3
9
4
1 2 3 4 5 6 7 8 9
0 1 6 5 INF INF INF 7 ...
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8
0 1 6 5 13 INF 11 7
1
1
6
7
5
5
10
3
9
4
1 2 3 4 5 6 7 8 9
0 1 6 5 INF INF INF 7 ...
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 6 5 INF INF INF 7 INF
1
1
6
7
5
5
10
3
9
4 2
コストの更新
1
2
3
4
9
7
5
8
6
1 2 3 4 5 6 7 8 9
0 1 6 5 8 INF 6 7 INF
1
1
6
7
5
5
10
3
9
4 2
コードの例:
ダイクストラ法
https://github.com/kazu0423/procon_example/
blob/master/dijkstra.cpp
全点対最短路問題
全点対最短路問題とは任意の2点間の最短路を

求める問題である.
全点対最短路問題
全点対最短路問題とは任意の2点間の最短路を

求める問題である.
ワーシャルフロイド法
ワーシャルフロイド法
dp[i][j]を頂点iから頂点jまでの最小コストを記憶

する変数とする.
dpの初期状態は隣接行列になっており,隣接して
いない頂点同士のコストはINFとする.
dp[i][i] = 0とする.(自分から自分はコスト0)
ワーシャルフロイド法
for(int k = 0; k< n; k++)

for(int i = 0; i < n; i++)

for(int j = 0; j < n; j++)

dp[i][j] = min(dp[i][j], dp[...
kのループ
kのループを以外の部分では,大体のイメージとし
て任意の2点間の距離について何かの更新をしてい
ることがわかる.
kのループ
kのループを以外の部分では,大体のイメージとし
て任意の2点間の距離について何かの更新をしてい
ることがわかる.
kは途中で立ち寄る頂点がどこなのかを

決めている.
コストの更新
1 2 3 4 5
1 0 4 INF 10 INF
2 4 0 5 INF 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5
10 4
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 9 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5
1...
コストの更新:k = 2
1 2 3 4 5
1 0 4 9 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5
1...
コストの更新:k = 2
1 2 3 4 5
1 0 4 9 10 5
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5
10 ...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF INF
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5...
コストの更新:k = 2
1 2 3 4 5
1 0 4 INF 10 INF
2 INF 0 5 4 1
3 INF 5 0 INF 6
4 10 INF INF 0 INF
5 INF 1 INF INF 0
4 2
3 1
5
1
5
1...
コードの例:
ワーシャルフロイド法
https://github.com/kazu0423/procon_example/
blob/master/warshall-floyed.cpp
計算量
ほぼ自明
時間計算量:O(V3)
空間計算量:O(V2)
まとめ
グラフの表現
単一始点最短路問題

ベルマンフォード法

ダイクストラ法
全点対最短路問題

ワーシャルフロイド法
Upcoming SlideShare
Loading in …5
×

グラフを扱おう:最短路問題

蟻本 最短経路問題

  • Be the first to comment

グラフを扱おう:最短路問題

  1. 1. グラフを扱おう: 最短路問題 北海道大学 情報科学研究科 修士1年 栗田和宏
  2. 2. グラフの定義(数学) グラフとは集合の組であり,G = (V, E)と
 表される.ここで E ⊆ (V,V)である. Vを頂点集合と呼び,Eを辺集合と呼ぶ.
  3. 3. グラフの表現法 グラフを表現する方法として2つ考えられる. 1. 隣接行列 2. 隣接リスト
  4. 4. グラフの表現法 グラフを表現する方法として2つ考えられる. 1. 隣接行列 2. 隣接リスト メモリ:小 検索:遅 メモリ:大 検索:速
  5. 5. 隣接行列 グラフの各頂点間の隣接関係を行列で表す.
  6. 6. 隣接行列 グラフの各頂点間の隣接関係を行列で表す. 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 2 3 4
  7. 7. 隣接行列 隣接行列にはO(V2)のメモリとある2頂点間に辺が あるかを検索するのにO(1)時間がかかる
  8. 8. 隣接リスト グラフの各頂点の隣接関係をリストで保持する. 1 2 3 4 1 2 31 23 24 1 2 4 4
  9. 9. 隣接リスト 隣接リストにはO(V + E)のメモリとある2頂点間に 辺があるかを検索するのにO(E)時間がかかる.
  10. 10. 単一始点最短路問題 単一始点最短路問題とは与えられた頂点sから他の すべての頂点への最短路を求める問題である.
  11. 11. 単一始点最短路問題 単一始点最短路問題とは与えられた頂点sから他の すべての頂点への最短路を求める問題である. ベルマンフォード法 ダイクストラ法
  12. 12. 最短路の性質 最小コストの重要な性質として次のことが言える. 頂点uの最小コストは
 uと隣接する頂点の最短路 + uへ移動するコスト
 の最小である. u v0 v1 v2 s ….. 3 5 1 1 3
  13. 13. ベルマンフォード法 1. 始点以外のコストをINFに,始点のコストを0に する. 2. すべての辺を使い,コストを更新する 3. コストの更新ができなかったら終了,更新ができ たら2に戻る.
  14. 14. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 INF INF INF INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  15. 15. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 INF 10 INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  16. 16. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 INF 10 INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  17. 17. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 0 1 6 5 13 INF 11 7 1 1 6 7 5 5 10 3 9 4 1 2 3 4 5 6 7 8 9 0 1 6 5 13 INF 11 7 INF 2
  18. 18. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 0 1 6 5 13 INF 11 7 1 1 6 7 5 5 10 3 9 4 1 2 3 4 5 6 7 8 9 0 1 6 5 13 INF 11 7 INF 2
  19. 19. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 6 5 8 16 6 7 14 1 1 6 7 5 5 10 3 9 4 2
  20. 20. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 6 5 8 16 6 7 14 1 1 6 7 5 5 10 3 9 4 2
  21. 21. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 6 5 8 11 6 7 14 1 1 6 7 5 5 10 3 9 4 2
  22. 22. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 6 5 8 11 6 7 14 1 1 6 7 5 5 10 3 9 4 2
  23. 23. 計算量 時間計算量:O(VE) もしくは O(V3) 空間計算量:O(E) もしくはO(V2) 時間計算量はグラフを隣接リストで持っておくと O(VE)になり,隣接行列で持っておくとO(V3)と
 なる.
  24. 24. コードの例: ベルマンフォード法 https://github.com/kazu0423/procon_example/ blob/master/bellman_ford.cpp
  25. 25. 計算量の解析 while文が入っていて,ぱっと見での計算量が
 わかりづらい. このwhile文は最大V - 1回のループをする 
 → なぜなら1回のループで少なくとも1つの頂点の 最短コストが決定するからである.
  26. 26. 計算量の解析 while文中の計算量はすべての辺についての操作を しているのでO(E)となる. 全体としてはO(VE)となる.
  27. 27. ダイクストラ法 ベルマンフォード法よりももっと高速に最短路を 求めるアルゴリズム. 仮定としてすべての辺のコストを非負とする.
  28. 28. ダイクストラ法 ベルマンフォード法よりももっと高速に最短路を 求めるアルゴリズム. 仮定としてすべての辺のコストを非負とする. ベルマンフォード法では最小コストが決定してい ない頂点に対しても更新をしていた. このような更新は無駄である.
  29. 29. 不要な更新 1 2 3 4 9 7 5 8 6 1 1 6 7 5 5 10 3 9 4 1 2 3 4 5 6 7 8 9 0 INF INF INF INF INF INF INF INF 2
  30. 30. 不要な更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 INF 10 INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  31. 31. 不要な更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 INF 10 INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  32. 32. なぜ不要か? 背理法で証明する. 仮定として現在最小コストが決まっていない頂点 の中でコスト最小の頂点がもっと小さいコストで その頂点に行けると別のパスがあると仮定する. そのようなパスは存在しないことが証明できる.
  33. 33. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 INF INF INF INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  34. 34. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 INF 10 INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  35. 35. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 INF 10 INF INF INF INF INF 1 1 6 7 5 5 10 3 9 4 2
  36. 36. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 0 1 6 5 13 INF 11 7 1 1 6 7 5 5 10 3 9 4 1 2 3 4 5 6 7 8 9 0 1 6 5 INF INF INF 7 INF 2
  37. 37. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 0 1 6 5 13 INF 11 7 1 1 6 7 5 5 10 3 9 4 1 2 3 4 5 6 7 8 9 0 1 6 5 INF INF INF 7 INF 2
  38. 38. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 6 5 INF INF INF 7 INF 1 1 6 7 5 5 10 3 9 4 2
  39. 39. コストの更新 1 2 3 4 9 7 5 8 6 1 2 3 4 5 6 7 8 9 0 1 6 5 8 INF 6 7 INF 1 1 6 7 5 5 10 3 9 4 2
  40. 40. コードの例: ダイクストラ法 https://github.com/kazu0423/procon_example/ blob/master/dijkstra.cpp
  41. 41. 全点対最短路問題 全点対最短路問題とは任意の2点間の最短路を
 求める問題である.
  42. 42. 全点対最短路問題 全点対最短路問題とは任意の2点間の最短路を
 求める問題である. ワーシャルフロイド法
  43. 43. ワーシャルフロイド法 dp[i][j]を頂点iから頂点jまでの最小コストを記憶
 する変数とする. dpの初期状態は隣接行列になっており,隣接して いない頂点同士のコストはINFとする. dp[i][i] = 0とする.(自分から自分はコスト0)
  44. 44. ワーシャルフロイド法 for(int k = 0; k< n; k++)
 for(int i = 0; i < n; i++)
 for(int j = 0; j < n; j++)
 dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
  45. 45. kのループ kのループを以外の部分では,大体のイメージとし て任意の2点間の距離について何かの更新をしてい ることがわかる.
  46. 46. kのループ kのループを以外の部分では,大体のイメージとし て任意の2点間の距離について何かの更新をしてい ることがわかる. kは途中で立ち寄る頂点がどこなのかを
 決めている.
  47. 47. コストの更新 1 2 3 4 5 1 0 4 INF 10 INF 2 4 0 5 INF 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4
  48. 48. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 INF 10 INF 2 4 0 5 INF 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0
  49. 49. コストの更新:k = 2 1 2 3 4 5 1 0 4 9 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 INF 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0
  50. 50. コストの更新:k = 2 1 2 3 4 5 1 0 4 9 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 INF 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0
  51. 51. コストの更新:k = 2 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 5 1 INF INF 0
  52. 52. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 5 1 INF INF 0
  53. 53. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 5 1 INF INF 0
  54. 54. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 5 1 INF INF 0
  55. 55. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 5 1 INF INF 0
  56. 56. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 4 0 5 INF 1 3 9 5 0 INF INF 4 10 INF INF 0 INF 5 5 1 INF INF 0
  57. 57. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 INF 10 INF 2 4 0 5 INF 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0
  58. 58. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 INF 10 INF 2 4 0 5 INF 1 3 INF 5 0 INF INF 4 10 INF INF 0 INF 5 INF 1 INF INF 0
  59. 59. コストの更新:k = 2 1 2 3 4 5 1 0 4 INF 10 INF 2 INF 0 5 4 1 3 INF 5 0 INF 6 4 10 INF INF 0 INF 5 INF 1 INF INF 0 4 2 3 1 5 1 5 10 4 1 2 3 4 5 1 0 4 9 10 5 2 INF 0 5 4 1 3 INF 5 0 INF 6 4 10 INF INF 0 INF 5 INF 1 INF INF 0 1 2 3 4 5 1 0 4 INF 10 INF 2 4 0 5 INF 1 3 INF 5 0 INF 6 4 10 INF INF 0 INF 5 INF 1 6 INF 0
  60. 60. コードの例: ワーシャルフロイド法 https://github.com/kazu0423/procon_example/ blob/master/warshall-floyed.cpp
  61. 61. 計算量 ほぼ自明 時間計算量:O(V3) 空間計算量:O(V2)
  62. 62. まとめ グラフの表現 単一始点最短路問題
 ベルマンフォード法
 ダイクストラ法 全点対最短路問題
 ワーシャルフロイド法

    Be the first to comment

    Login to see the comments

  • KazuyaMaeda1

    Jun. 25, 2017
  • TomohiroIriki

    Nov. 7, 2018
  • ssuser876046

    Nov. 27, 2019
  • YusukeWashio

    May. 25, 2020
  • YasuhiroTadenuma

    May. 26, 2020

蟻本 最短経路問題

Views

Total views

5,820

On Slideshare

0

From embeds

0

Number of embeds

12

Actions

Downloads

35

Shares

0

Comments

0

Likes

5

×