2022-11-22-Dijkstra最短路算法
假设我们用数据结构
单源多汇最短路,无负权边
已经访问的点是已经确定了最短路的点,未访问的点是有待确认的点
对于一个未访问的点中
而其他的点的
操作3的总复杂度为
操作5的总复杂度为
复杂度
操作3总复杂度为
操作4总复杂度为
操作5总复杂度为
复杂度
类似于堆,但是没有修改和删除操作,所以队内元素有
操作3总复杂度为
操作5总复杂度为
复杂度
不过
稀疏图中,
稠密图中,
typedef pair<int, int> pii;
int dis[NV], S;
bool vis[NV];
void Dijkstra() {
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f, sizeof(dis));
dis[S] = 0;
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push(make_pair(0, S));
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = hd[u]; i; i = e[i].nxt) {
int v = e[i].to;
int c = e[i].c;
if (dis[v] > dis[u] + c) {
dis[v] = dis[u] + c;
q.push(make_pair(dis[v], v));
}
}
}
}
void Dijkstra_BF() {
memset(dis, 0x3f, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[S] = 0;
// 每次循环能标记一个点
for (int iV = 1; iV < n; iV++) {
int min_dis = INF;
int u;
for (int i = 1; i <= n; i++) {
if (!vis[i] && dis[i] < min_dis) {
min_dis = dis[i];
u = i;
}
}
vis[u] = true;
for (int i = hd[u]; i; i = e[i].nxt) {
int v = e[i].to;
int c = e[i].c;
if (dis[v] > dis[u] + c) {
dis[v] = dis[u] + c;
}
}
}
}