dijkstra
单源最短路
O(mn)
O(mlogn)优先队列优化
理解:点与源最近的距离等于直接边权或中转后和距离 贪心思路-选择已探明的点中距离最小的点
/*
数据存储形式 带权邻接表 vector<pair<int, int>>e[N];
辅助数组
vis[N] 节点是否固定
优先队列
priority_queue<pair<int,int>>q;
*/
int d[N];
int n,m;
void dijkstra(int s) {
memset(d, 0x3f3f3f, sizeof(d));
d[s] = 0;
q.push({ 0,s });
st[s] = 1;
while(!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u] == 1)continue;//优先队列中有可能有同一个节点多次重复进入 距离最小的先出队 之后的出队时跳过
vis[u] = 1;
int num = e[u].size();
for (int j = 0; j < num; j++) {
int v = e[u][j].first;
int w = e[u][j].second;
if (d[v] > d[u] + w && vis[v] == 0) {
d[v] = d[u] + w;
q.push({-d[v], v});//即使点在队列中 距离更新后也要重复入队
}
}
}
}
floyd
多源最短路
O(n^3)
/*
数据存储形式 邻接矩阵d[i][j]
*/
void floyd() {
for (int i = 1; i <= n; i++) {//自身节点置零
d[i][i] = 0;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j];
}
}
}
}
浙公网安备 33010602011771号