单源最短路问题模板

 

最近开始学习最短路算法。

单源最短路问题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的值,所以可以用来检查负圈。

 

posted @ 2016-04-20 13:04  卷珠帘  阅读(192)  评论(0编辑  收藏  举报