1018 Public Bike Management (30) Dijkstra算法 + DFS
題目及題解
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