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.
AOJ0234にみるダイクストラ法の応用OGURA
2ダイクストラ法• 単一始点最短距離13その他の頂点1532コスト(距離)始点遠い…
321アルゴリズムの内容1. 始点からの最短距離確定組 vs 未確定組にわける2. 未確定組の中で最短でいける頂点を確定組の仲間にする101532始点その他の頂点1手目 始点:0, 1:∞, 2:∞, 3:∞ 確定組(始点)• 始点から始点への...
AOJ0234• 始点がいっぱい• 終点もいっぱい• ノードの状態が変化• 条件(空気)がある始点(1,1)始点(2,1)始点(3,1)始点(4,1)(1,2)(1,n)終点(2,2)(3,2)(4,2)(2,n)終点(3,n)終点(4,n)終...
ノードの分割1. ノードの状態が変わる のはめんどくさい2. 別のノードとして捉える3. 頂点(x,y,left,right,oxigen)で考える(0,0)(0,0,0,0,1)(1,0)(0,1) (1,1)普通の捉え方distance[x...
実装方法• struct Node {int cost,x,y,left,right,oxigen; (コンストラクタもかく) };• std::priority_queue<Node> Q;• 始点: REP(x,W) Q.push(Node...
まとめ• 頂点情報を工夫する(ノードやエッジは固定がいい)• 頂点情報の次元と値域=> 配列サイズ• ダイクストラは最小を見つけられる• 負のエッジは怖いけど工夫次第では無くせる場合がある
おわり
Upcoming SlideShare
Loading in …5
×

AOJ0234にみるダイクストラ法の応用

ダイクストラ法の頂点を工夫して、ルールを簡単にしよう

  • Be the first to comment

AOJ0234にみるダイクストラ法の応用

  1. 1. AOJ0234にみるダイクストラ法の応用OGURA
  2. 2. 2ダイクストラ法• 単一始点最短距離13その他の頂点1532コスト(距離)始点遠い…
  3. 3. 321アルゴリズムの内容1. 始点からの最短距離確定組 vs 未確定組にわける2. 未確定組の中で最短でいける頂点を確定組の仲間にする101532始点その他の頂点1手目 始点:0, 1:∞, 2:∞, 3:∞ 確定組(始点)• 始点から始点への最短距離は0なので始点を確定組に追加2手目 始点:0, 1:10, 2:15, 3:∞ 確定組(始点)• 確定組から行ける最短距離を更新する(始点→1,始点→2)3手目 始点:0, 1:10, 2:15, 3:∞ 確定組(始点,1)• 未確定組の中で始点から最短なやつを確定組に追加• 確定組から行ける最短距離を更新する(始点→2,1→2)4手目 始点:0, 1:10, 2:13, 3:∞ 確定組(始点,1)最短距離頂点1 : 10頂点2 : 13頂点3 : 15• 未確定組の中で始点から最短なやつを確定組に追加5手目 始点:0, 1:10, 2:13, 3:∞ 確定組(始点,1,2)
  4. 4. AOJ0234• 始点がいっぱい• 終点もいっぱい• ノードの状態が変化• 条件(空気)がある始点(1,1)始点(2,1)始点(3,1)始点(4,1)(1,2)(1,n)終点(2,2)(3,2)(4,2)(2,n)終点(3,n)終点(4,n)終点縦は一方通行縦でも横でも空気=空気-1+100→0-1000-100→0状態の変化
  5. 5. ノードの分割1. ノードの状態が変わる のはめんどくさい2. 別のノードとして捉える3. 頂点(x,y,left,right,oxigen)で考える(0,0)(0,0,0,0,1)(1,0)(0,1) (1,1)普通の捉え方distance[x][y] =最小コスト+3 -10-10 or 0+3 or 0-1 + 5+5 or 0-1 or 0(1,0,0,0,10)初期空気=2最大空気=5仮の始点を置く場合もあるが今回は置かないほうが楽3 0(1,0,1,1,5)5(1,1,1,1,4)3(0,0,0,1,4)0(1,0,0,1,3)1++1(0,1,0,0,0)空気がないので行き止まり(1,0,0,1,5)00(0,0,0,1,4)1(0,1,0,0,3)空気があるので行き止まらない仮の終点を置く場合もあるが空気1以上でy==HEIGHT-1 の頂点をみたらいいdistance[x][y][l][r][o] =最小コスト
  6. 6. 実装方法• struct Node {int cost,x,y,left,right,oxigen; (コンストラクタもかく) };• std::priority_queue<Node> Q;• 始点: REP(x,W) Q.push(Node(コスト[0][x],x,0,x,x,min(最大,初期空気+空気[0][x]-1)))• ノード: Node node = Q.top(); Q.pop();• 終点: if(node.oxigen>=1 && node.y==HEIGHT-1) return node.cost;• while(!Q.empty())して毎回最小コストのNodeから道を作る
  7. 7. まとめ• 頂点情報を工夫する(ノードやエッジは固定がいい)• 頂点情報の次元と値域=> 配列サイズ• ダイクストラは最小を見つけられる• 負のエッジは怖いけど工夫次第では無くせる場合がある
  8. 8. おわり

    Be the first to comment

    Login to see the comments

  • shushimizu12

    Jun. 17, 2014

ダイクストラ法の頂点を工夫して、ルールを簡単にしよう

Views

Total views

1,093

On Slideshare

0

From embeds

0

Number of embeds

2

Actions

Downloads

0

Shares

0

Comments

0

Likes

1

×