Bellman-Ford可以检测负圈,有些时候还是很有必要。现在理解的不是很深,等以后再回来加以完善,先放一段代码。
struct edge{
int from;
int to;
int cost;
};
edge es[MXAN];
int d[MXAN];
int V, E; // V是顶点数,E是边数
void shortest_path(int s){
for(int i = 0; i < V; ++i)
d[i] = INF;
d[s] = 0; // s是出发点
while(true){
bool update = false;
for(int i = 0; i < E; ++i){
edge e = es[i];
if(d[e.from] != INF && d[e.to] > d[e.from] + e.cost){
d[e.to] = d[e.from] + e.cost;
update = true;
}
}
if(!update)
break;
}
}
bool find_negative_loop(){
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;
}