Dijkstra 最短路
阿新 • • 發佈:2021-06-29
求單源 \(s\) 到任意一點的最短路徑。最短路徑儲存在陣列 dis
中。
鏈式前向星
#include <queue> priority_queue<pair<ll, ll>> q; void dijkstra(int s) { memset(dis, 0x3f, sizeof(dis)); //初始邊無限大 memset(vis, 0, sizeof(vis)); //結點初始均為訪問 dis[s] = 0; //起點到自己距離為0 q.push(make_pair(0, s)); //起點進隊 while (!q.empty()) { x = q.top().second; q.pop(); //初始結點入隊 if (vis[x]) continue; //如果走過,直接跳過 vis[x] = 1; //標記已訪問 for (ll i = head[x]; i != -1; i = t[i].nxt) { ll y = t[i].to, z = t[i].w; if (dis[y] > dis[x] + z) { dis[y] = dis[x] + z; //更新起點到y最短路 q.push(make_pair(-dis[y], y)); //d[y]相反數入隊,轉小根堆 } } } } int main() { for (int i = 1; i <= n; ++i) head[i] = -1; ... } //後面省略
vector
void dj(int s) { memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof vis); dis[s] = 0; q.push(make_pair(0, s)); while (!q.empty()) { ll x = q.top().second; q.pop(); if (vis[x]) continue; vis[x] = 1; for (int i = 0; i < t[x].size(); ++i) { ll y = t[x][i].to, z = t[x][i].w; if (dis[y] > dis[x] + z) { dis[y] = dis[x] + z; q.push(make_pair(-dis[y], y)); } } } }