floyd演算法(各對頂點之間的最短距離)
在上篇文章中談論到了如何求算單源最短路徑,因此要想求各對頂點之間的距離,只需迴圈求算n次即可。還有另外一種方法來求算各對頂點之間的最短距離,就是floyd演算法,由於其演算法過程比dijkstra更容易理解,並且**更簡潔,因此當求算各對頂點之間的最短距離常採用floyd演算法。
一.floyd演算法
假設從i到j的最短路徑上要經過若干個頂點,這些中間頂點中最大的頂點編號為k,最小的頂點為t,因此要求算dist[i][j]的最小值,那麼只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,並取其中最小者即可。因此可以設定乙個中間頂點k(0<=k**實現:
/*每對頂點之間最短路徑floyd 2011.8.27
*/#include
<
iostream
>
#include
<
stack
>
#define
m 100
#define
n 100
using
namespace
std;
typedef
struct
node
mgraph;
void
floydpath(mgraph g,
intdist[n][m],
intpath[n][m])
else
else
}}for(k=0
;k<
g.n;k
++)
//中間插入點(注意理解k為什麼只能在最外層)
for(i=0
;i<
g.n;i
++)
for(j=0
;j<
g.n;j++)
}
}void
showpath(
intpath[n][m],
ints,
intt)
//列印出最短路徑
st.push(t);
while(!
st.empty())
}int
main(
intargc,
char
*ar**)
floydpath(g,dist,path);
for(i=0
;i<
g.n;i++)
for(j=0
;j<
g.n;j++)
}
}return0;
}
Floyd(各對頂點之間的最短距離)
我們其實可以求n次dijkstra,就可以求出各對頂點的最短路了。但是這不是重點,有乙個比他更清晰易懂的演算法 floyd 假設從i到j的最短路徑上要經過若干個頂點,這些中間頂點中最大的頂點編號為k,最小的頂點為t,因此要求算dist i j 的最小值,那麼只需要求算dist i s dist s ...
弗洛伊德演算法 從某個頂點到其他頂點之間的最短路徑
弗洛伊德演算法 include include include include define infinity 65535 定義乙個無限大的值 define maxsize 50 最大頂點個數 include using namespace std typedef char vertextype 4...
Floyd演算法(求每一對頂點之間的最短距離)
include include define ok 1 define error 1 define max vertex num 12 define network infinity 32767 typedef struct arccell adjmatrix max vertex num max ...