1. 程式人生 > >1018 Public Bike Management (30) Dijkstra算法 + DFS

1018 Public Bike Management (30) Dijkstra算法 + DFS

== net pub blog sta 認識 pop false inf

題目及題解

https://blog.csdn.net/CV_Jason/article/details/81385228

迪傑斯特拉重新認識

兩個核心的存儲結構:

int dis[n];  //記錄每個點到源頭的最短距離

bool mark[n];  //標記每個頂點到

/*如果想要保存路徑,創建一個 二維數組,或者vector【n】,

裏面的每個一維數組表示到達該節點的前一個節點,在(u為當前選出的新節點)當dis[v]==dis[u]+e[u][v],說明通過u到達v的路徑也是最短路徑,於是把u加入vector【v】;

如果(u為當前選出的新節點)當dis[v]>dis[u]+e[u][v],則說明有更短的路徑,於是vector【v】.clean();清空vector【v】,然後加入u

這樣任意一點x,(像遍歷樹一樣)只使用dfs/bfs就能把所有從x到源的路徑求出;

一個核心公式:

e[a][b]+dis[b]<e[a];  //當通新加入的節點b到達a的路程 ,比已知的到a的路程短,則把dis[a]更新為e[a][b]+dis[b];

流程:

初始化:

dis 設置成inf     //自定義無窮

mark 設置成false    

dis[0]設置成0      //0可換成任意一點源

執行核心過程:

for(n次,每次加入一個點)

{  設置兩個變量記錄每次找的最小的點的 下標和距離

  for(n次,找一個未加入的點)

  {  當if(mark【i】==false&&dis【i】<minDis)則更新下標和當前發現的最小距離}

  for(n次,檢查是否能用新的點更新原來dis【n】)

  {}

}

深度優先 復習

外界 stack/vector

dfs(x)

{  s或v push(x)

  if(x為最深一層)

  {一系列的處理操作}

  for(能從x往下走的路)

  { dfx(x+/-1) }

  s或v pop;//回溯到沒有上一層的x,繼續執行上一層for(x的下一條路 )的

}

1018 Public Bike Management (30) Dijkstra算法 + DFS