dijkstra法
- 7. Strictly Confidential
Copyright©︎株式会社Acompany All rights reserved.
・頂点数が増えると経路の総数は急激に増加する
最短経路を求める
引用:https://www.miraikan.jst.go.jp/sp/medialab/11.html
メディアラボ第11期展示「フカシギの数え方」© National Museum of Emerging Science and Innovation
・効率よく計算できる様にしたい
→Dijkstra法を使う
- 9. Strictly Confidential
Copyright©︎株式会社Acompany All rights reserved.
Dijkstra法の流れ
1. 始点を決め、始点の距離を0にする
2. 始点と繋がっている全ての頂点においてその辺のコストを暫定の
最短距離とする.
3. まだ通っていない頂点のなかで距離が最小の頂点に移動する.
4. 今いる頂点と繋がっている,まだ通っていない頂点の最短距離を更
新する
5. 3と4を繰り返し行う
6. 更新がされなくなったら終了
- 19. Strictly Confidential
Copyright©︎株式会社Acompany All rights reserved.
Dijkstraを用いる問題
(x,y)から(x’,y’)に移動する
dist[x][y]+1<dist[x’][y’]
→cnt[x’][y’]=cnt[x][y]
dist[x][y]+1==dist[x’][y’]
→cnt[x’][y’]+=cnt[x][y]
https://onlinejudge.u-aizu.ac.jp/beta/room.html#ACPC2018Day2/problems/D
- 24. Strictly Confidential
Copyright©︎株式会社Acompany All rights reserved.
拡張ダイクストラ
・1つの頂点を(駅,銀貨の枚数)とする
→制約より銀貨は最大で2500枚あればいいので頂点数は50*2500
となる
・各頂点に対して辺を張る
・金貨を銀貨に変える辺を張る
現在の頂点を(i,C)として駅vで金貨を銀貨ci枚にできるとすると
(i,C+ci),(i,C+2ci)...
と遷移できるが実際には(i,C+ci)だけで十分
・他の頂点への移動はいつも通り行う
あとは普通のDijkstraをするだけで解ける