Algorithm 具有负权重的Dijkstra算法
这是我在网上找到的dijkstra算法的一个实现。任何人都可以找到一个可能不起作用的带有负面边缘的示例Algorithm 具有负权重的Dijkstra算法,algorithm,graph,shortest-path,Algorithm,Graph,Shortest Path,这是我在网上找到的dijkstra算法的一个实现。任何人都可以找到一个可能不起作用的带有负面边缘的示例 vector<edge> adj[100]; vector<int> dist(100, INF); void dijkstra(int start) { dist[start] = 0; priority_queue<pair<int, int>, vector<pair<int, int> >,
vector<edge> adj[100];
vector<int> dist(100, INF);
void dijkstra(int start) {
dist[start] = 0;
priority_queue<pair<int, int>,
vector<pair<int, int> >,
greater<pair<int, int> > > pq;
pq.push(make_pair(dist[start], start));
while (!pq.empty()) {
int u = pq.top().second,
d = pq.top().first;
pq.pop();
if (d > dist[u]) continue;
for (int i = 0; i < adj[u].size(); i++) {
int v = adj[u][i].v,
w = adj[u][i].weight;
if (w + dist[u] < dist[v]) {
dist[v] = w + dist[u];
pq.push(make_pair(dist[v], v));
}
}
}
向量调整[100];
向量距离(100,INF);
void dijkstra(整数起点){
距离[开始]=0;
优先级队列pq;
pq.推送(配对(距离[开始],开始));
而(!pq.empty()){
int u=pq.top().秒,
d=pq.top().第一个;
pq.pop();
如果(d>dist[u])继续;
对于(int i=0;i好的是,如果终止,它将始终返回正确的答案。但是,如果包含负权重,则算法可能需要很长时间才能终止(特别是,如果存在负权重循环,则此算法将永远不会终止).示例是带有负权重的循环
我的印象是,在最短路径问题中不考虑负权重循环,因为从技术上讲,最短路径是负无穷大的。如果没有循环,则需要的时间几乎与使用访问集实现的时间相同,因为条件是“如果(d>dist[u])继续因此,我们是否可以得出结论,如果没有负周期存在,它会比bellmann ford好,并且会给出正确的答案。在实践中,它会期望它会更好,但需要警告的是,可以构建需要指数时间才能终止的图。交叉发布:,。请。每个社区都应该诚实地回答wi尽管任何人的时间都被浪费了。