O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
目指せグラフマスター
目指せグラフマスター
Carregando em…3
×

Confira estes a seguir

1 de 62 Anúncio
Anúncio

Mais Conteúdo rRelacionado

Mais de HCPC: 北海道大学競技プログラミングサークル (20)

Mais recentes (20)

Anúncio

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

  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. まとめ グラフの表現 単一始点最短路問題
 ベルマンフォード法
 ダイクストラ法 全点対最短路問題
 ワーシャルフロイド法

×