【发布时间】:2021-08-10 21:20:07
【问题描述】:
D'Escopo-Pape 算法在实现上与 Dijkstra 算法非常相似,适用于负权重边缘,但不适用于负循环。在大多数情况下,它显然比 Dijkstra 算法和 Bellman-Ford 算法更快。但是显然存在这种算法需要指数时间的特殊情况,有人可以提供一些示例或指向我一些更彻底地分析该算法的材料。
这是实现:
struct Edge {
int to, w;
};
int n;
vector<vector<Edge>> adj;
const int INF = 1e9;
void shortest_paths(int v0, vector<int>& d, vector<int>& p) {
d.assign(n, INF);
d[v0] = 0;
vector<int> m(n, 2);
deque<int> q;
q.push_back(v0);
p.assign(n, -1);
while (!q.empty()) {
int u = q.front();
q.pop_front();
m[u] = 0;
for (Edge e : adj[u]) {
if (d[e.to] > d[u] + e.w) {
d[e.to] = d[u] + e.w;
p[e.to] = u;
if (m[e.to] == 2) {
m[e.to] = 1;
q.push_back(e.to);
} else if (m[e.to] == 0) {
m[e.to] = 1;
q.push_front(e.to);
}
}
}
}
}
这是我使用的网站的链接:D'Esopo-Pape
就特殊情况和时间复杂性而言,这并没有真正深入。
【问题讨论】:
-
您真的在问为什么人们更喜欢最坏情况二次(或 V² log V 或其他)的算法而不是通常的算法快速但有时呈指数增长?
-
是的,我编辑了它,问这样的问题有点愚蠢。因为我大部分时间都花在做竞技编程(当时我还在上高中)所以我默认为小任务(如果您愿意冒险,小的优化可以产生影响)而不是研究或实际项目......
标签: c++ algorithm time-complexity