最近开始学习最短路算法。
单源最短路问题1(Bellman-Ford算法)
不存在负圈时,
1 const int INF = 0x3f3f3f3f; 2 struct edge{ 3 int from, to, cost; 4 }; 5 edge es[maxn_e]; //边 6 int d[maxn_v]; //最短距离 7 int v,e; //v是定点数,e是边数 8 void shorttest_path(int s){ 9 for(int i = 0; i<v; i++) d[i] = INF; 10 d[s] = 0; 11 while(1){ 12 bool update = false; 13 for(int i = 0; i<e; i++){ 14 edge e = es[i]; 15 if(d[e.from] != INF && d[e.to]>d[e.from]+d[e.cost]){ 16 d[e.to] = d[e.from]+d[e.cost]; 17 update = true; 18 } 19 } 20 if(!update) break; 21 } 22 }
最短路不会经过同一顶点两次(也就是说最多通过v-1条边) while(1)最多执行v-1次,时间复杂度o(v*e).
如果存在从s可达的负圈,那么在第v次循环中也会更新d的值,所以可以用来检查负圈。