首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dijkstra的Single Source Shortest Path算法能检测到图中的无限循环吗?

Dijkstra的Single Source Shortest Path算法能检测到图中的无限循环吗?
EN

Stack Overflow用户
提问于 2013-11-21 22:05:17
回答 2查看 11.9K关注 0票数 9

所以我来到了这个美丽的问题,它要求你写一个程序,找出在有向图中是否存在负无穷短路径。(也可以认为是查找图中是否存在“负循环”)。下面是这个问题的链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=499

我成功地解决了这个问题,我从图中的任何源开始,运行了两次Bellman Ford算法。第二次运行算法时,我检查节点是否可以松弛。如果是这样,那么在图中肯定有一个负循环。下面是我的C++代码:

代码语言:javascript
复制
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
    int test;
    cin>>test;

    for(int T=0; T<test; T++)
    {

        int node, E;

        cin>>node>>E; 

        int **edge= new int *[E];
        for(int i=0; i<E; i++)
        {
            edge[i]= new int [3];
            cin>>edge[i][0]>>edge[i][1]>>edge[i][2];
        }

        int *d= new int [node];

        bool possible=false;

        for(int i=0; i<node;i++)
        {
            d[i]= 999999999;
        }

        d[node-1]=0;

        for(int i=0; i<node-1; i++)
        {

            for(int j=0; j<E; j++)
            {
                if(d[edge[j][1]]>d[edge[j][0]]+edge[j][2])
                    d[edge[j][1]]=d[edge[j][0]]+edge[j][2];
            }
        }

        // time to judge!
        for(int i=0; i<node-1; i++)
        {

            for(int j=0; j<E; j++)
            {
                if(d[edge[j][1]]>d[edge[j][0]]+edge[j][2])
                {
                    possible=true;
                    break;
                }

            } 

            if(possible)
                break;

        }

        if(possible)
            cout<<"possible"<<endl;
        else
            cout<<"not possible"<<endl;

    }
}

一位教授曾经告诉我,Dijkstra的最短路径算法找不到这样的负循环,但他没有证明这一点。实际上,我对这种说法表示怀疑。

我的问题是,Dijktstra的单源最短路径算法能检测到这个负循环吗?

当然,我可以尝试Dijkstra的,并检查它是否有效,但我很高兴能与您分享这个想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-21 22:11:39

你误解了你的教授:他一定是说,如果图中存在循环,那么Dijkstra的算法将不起作用。允许正周期。

该算法不适用于具有负圈的图的原因是,这类图中的最短路径是未定义的:一旦到达负圈,您可以通过多次跟随负圈将“最短路径”的成本降低到您希望的程度。

考虑上面的例子:从顶点Start开始,以1的代价到达A。然后你用-1的总成本转到B,用-4的总成本转到C,现在你可以回到A,总成本为零。通过扩展序列Start-A-B-C-A-B-C-A-B-C-...-Finish,您可以将从StartFinish的路径的开销减少到您希望的负数。

请注意,负圈限制适用于在图中寻找最短路径的所有算法。对Dijkstra算法的限制甚至更强:它禁止所有负边。

当然可以修改Dijkstra的算法来检测负循环,但这样做没有意义,因为您有一个更强的限制,没有负边。

票数 18
EN

Stack Overflow用户

发布于 2013-11-22 00:34:49

Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法都不适用于具有负圈的图,但后两种算法可以检测到负圈,而Dijkstra算法则不能,因为Dijkstra算法是贪婪的,而其他算法则使用动态规划。此外,即使没有负循环,Dijkstra也不能使用负权重。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20123076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档