所以我遇到了这个美丽的问题,它要求你编写一个程序来确定有向图中是否存在负无穷最短路径。(也可以认为是查找图中是否存在“负循环”)。这是问题的链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=499
我通过从图中的任何源开始运行 Bellman Ford 算法两次成功地解决了这个问题。第二次运行算法时,我检查一个节点是否可以放松。如果是这样,那么图中肯定存在负循环。下面是我的 C++ 代码:
#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 并检查它是否有效,但我很高兴能与您分享这个想法。