探讨负环图的最短路问题是没有意义的。
由于Bellman-Ford算法复杂度o(|V|* |E|),while(true)最多执行|V|-1次,如果第|V|次还进行了更新那么就还要继续执行|V|次了,通过这个特新便可o(|V|*|E|)判断负环图了。
struct edge{int from,to,cost;};
edge es[MAX_E];
int d[MAX_V];
int V,E;
bool check(){
memset(d,0,sizeof(d));
for(int i=0;i<V;i++)
for(int j=0;j<E;j++){
edge e=es[j];
if(d[e.to]>d[e.from]+e.cost){
d[e.to]=d[e.from]+e.cost;
if(i==V-1) return true;
}
}
return false;
}
参考《挑战程序设计竞赛》