Algorithm 具有负权重的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> >,

这是我在网上找到的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> >,
    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通常,Dijsktra的算法包括一个访问集,这意味着我们可以避免重新访问节点,并且可以在访问目的地后立即终止

此实现不使用这样的集合。这意味着它可以重新访问节点并调整距离(如果减少)


好的是,如果终止,它将始终返回正确的答案。但是,如果包含负权重,则算法可能需要很长时间才能终止(特别是,如果存在负权重循环,则此算法将永远不会终止).

示例是带有负权重的循环


我的印象是,在最短路径问题中不考虑负权重循环,因为从技术上讲,最短路径是负无穷大的。如果没有循环,则需要的时间几乎与使用访问集实现的时间相同,因为条件是“如果(d>dist[u])继续因此,我们是否可以得出结论,如果没有负周期存在,它会比bellmann ford好,并且会给出正确的答案。在实践中,它会期望它会更好,但需要警告的是,可以构建需要指数时间才能终止的图。交叉发布:,。请。每个社区都应该诚实地回答wi尽管任何人的时间都被浪费了。