shortest path

62
グラフを扱おう: 最短路問題 北海道大学 情報科学研究科 修士1栗田和宏

Upload: hcpchokudai

Post on 11-Aug-2015

26 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Shortest path

グラフを扱おう: 最短路問題北海道大学 情報科学研究科

修士1年 栗田和宏

Page 2: Shortest path

グラフの定義(数学)グラフとは集合の組であり,G = (V, E)と表される.ここで E ⊆ (V, V)である.

Vを頂点集合と呼び,Eを辺集合と呼ぶ.

Page 3: Shortest path

グラフの表現法グラフを表現する方法として2つ考えられる.

1. 隣接行列

2. 隣接リスト

Page 4: Shortest path

グラフの表現法グラフを表現する方法として2つ考えられる.

1. 隣接行列

2. 隣接リスト メモリ:小 検索:遅

メモリ:大 検索:速

Page 5: Shortest path

隣接行列グラフの各頂点間の隣接関係を行列で表す.

Page 6: Shortest path

隣接行列グラフの各頂点間の隣接関係を行列で表す.

0 1 0 1

1 0 1 1

0 1 0 0

1 1 0 0

12

34

Page 7: Shortest path

隣接行列隣接行列にはO(V2)のメモリとある2頂点間に辺があるかを検索するのにO(1)時間がかかる

Page 8: Shortest path

隣接リストグラフの各頂点の隣接関係をリストで保持する.

12

34

1 2

31

23

24 1

2

4

4

Page 9: Shortest path

隣接リスト隣接リストにはO(V + E)のメモリとある2頂点間に辺があるかを検索するのにO(E)時間がかかる.

Page 10: Shortest path

単一始点最短路問題単一始点最短路問題とは与えられた頂点sから他のすべての頂点への最短路を求める問題である.

Page 11: Shortest path

単一始点最短路問題単一始点最短路問題とは与えられた頂点sから他のすべての頂点への最短路を求める問題である.

ベルマンフォード法

ダイクストラ法

Page 12: Shortest path

最短路の性質最小コストの重要な性質として次のことが言える.

頂点uの最小コストはuと隣接する頂点の最短路 + uへ移動するコストの最小である.

uv0

v1

v2

s …..

3

51

1

3

Page 13: Shortest path

ベルマンフォード法1. 始点以外のコストをINFに,始点のコストを0にする.

2. すべての辺を使い,コストを更新する

3. コストの更新ができなかったら終了,更新ができたら2に戻る.

Page 14: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 15: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 16: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 17: Shortest path

コストの更新

12

34

97

5

8

6

1 2 3 4 5 6 7 8

0 1 6 5 13 INF 11 7

1

1

6

7

55

10

39

4

1 2 3 4 5 6 7 8 9

0 1 6 5 13 INF 11 7 INF

2

Page 18: Shortest path

コストの更新

12

34

97

5

8

6

1 2 3 4 5 6 7 8

0 1 6 5 13 INF 11 7

1

1

6

7

55

10

39

4

1 2 3 4 5 6 7 8 9

0 1 6 5 13 INF 11 7 INF

2

Page 19: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 20: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 21: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 22: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 23: Shortest path

計算量時間計算量:O(VE) もしくは O(V3)

空間計算量:O(E) もしくはO(V2)

時間計算量はグラフを隣接リストで持っておくとO(VE)になり,隣接行列で持っておくとO(V3)となる.

Page 24: Shortest path

コードの例: ベルマンフォード法

https://github.com/kazu0423/procon_example/blob/master/bellman_ford.cpp

Page 25: Shortest path

計算量の解析while文が入っていて,ぱっと見での計算量がわかりづらい.

このwhile文は最大V - 1回のループをする → なぜなら1回のループで少なくとも1つの頂点の最短コストが決定するからである.

Page 26: Shortest path

計算量の解析while文中の計算量はすべての辺についての操作をしているのでO(E)となる.

全体としてはO(VE)となる.

Page 27: Shortest path

ダイクストラ法ベルマンフォード法よりももっと高速に最短路を求めるアルゴリズム.

仮定としてすべての辺のコストを非負とする.

Page 28: Shortest path

ダイクストラ法ベルマンフォード法よりももっと高速に最短路を求めるアルゴリズム.

仮定としてすべての辺のコストを非負とする.

ベルマンフォード法では最小コストが決定していない頂点に対しても更新をしていた.

このような更新は無駄である.

Page 29: Shortest path

不要な更新

12

34

97

5

8

6

1

1

6

7

55

10

39

4

1 2 3 4 5 6 7 8 9

0 INF INF INF INF INF INF INF INF

2

Page 30: Shortest path

不要な更新

12

34

97

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

55

10

39

4 2

Page 31: Shortest path

不要な更新

12

34

97

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

55

10

39

4 2

Page 32: Shortest path

なぜ不要か?背理法で証明する.

仮定として現在最小コストが決まっていない頂点の中でコスト最小の頂点がもっと小さいコストでその頂点に行けると別のパスがあると仮定する.

そのようなパスは存在しないことが証明できる.

Page 33: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 34: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 35: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 36: Shortest path

コストの更新

12

34

97

5

8

6

1 2 3 4 5 6 7 8

0 1 6 5 13 INF 11 7

1

1

6

7

55

10

39

4

1 2 3 4 5 6 7 8 9

0 1 6 5 INF INF INF 7 INF

2

Page 37: Shortest path

コストの更新

12

34

97

5

8

6

1 2 3 4 5 6 7 8

0 1 6 5 13 INF 11 7

1

1

6

7

55

10

39

4

1 2 3 4 5 6 7 8 9

0 1 6 5 INF INF INF 7 INF

2

Page 38: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 39: Shortest path

コストの更新

12

34

97

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

55

10

39

4 2

Page 40: Shortest path

コードの例: ダイクストラ法

https://github.com/kazu0423/procon_example/blob/master/dijkstra.cpp

Page 41: Shortest path

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

Page 42: Shortest path

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

ワーシャルフロイド法

Page 43: Shortest path

ワーシャルフロイド法dp[i][j]を頂点iから頂点jまでの最小コストを記憶する変数とする.

dpの初期状態は隣接行列になっており,隣接していない頂点同士のコストはINFとする.

dp[i][i] = 0とする.(自分から自分はコスト0)

Page 44: Shortest path

ワーシャルフロイド法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]);

Page 45: Shortest path

kのループkのループを以外の部分では,大体のイメージとして任意の2点間の距離について何かの更新をしていることがわかる.

Page 46: Shortest path

kのループkのループを以外の部分では,大体のイメージとして任意の2点間の距離について何かの更新をしていることがわかる.

kは途中で立ち寄る頂点がどこなのかを決めている.

Page 47: Shortest path

コストの更新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

510 4

Page 48: Shortest path

コストの更新:k = 21 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

510 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

Page 49: Shortest path

コストの更新:k = 21 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

510 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

Page 50: Shortest path

コストの更新:k = 21 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

510 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

Page 51: Shortest path

コストの更新:k = 21 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

510 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

Page 52: Shortest path

コストの更新:k = 21 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

510 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

Page 53: Shortest path

コストの更新:k = 21 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

510 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

Page 54: Shortest path

コストの更新:k = 21 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

510 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

Page 55: Shortest path

コストの更新:k = 21 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

510 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

Page 56: Shortest path

コストの更新:k = 21 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

510 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

Page 57: Shortest path

コストの更新:k = 21 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

510 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

Page 58: Shortest path

コストの更新:k = 21 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

510 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

Page 59: Shortest path

コストの更新:k = 21 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

510 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

Page 60: Shortest path

コードの例: ワーシャルフロイド法

https://github.com/kazu0423/procon_example/blob/master/warshall-floyed.cpp

Page 61: Shortest path

計算量ほぼ自明

時間計算量:O(V3)

空間計算量:O(V2)

Page 62: Shortest path

まとめグラフの表現

単一始点最短路問題ベルマンフォード法 ダイクストラ法

全点対最短路問題ワーシャルフロイド法