Floyd算法
●
Floyd
算法用来解决全源最短路径问题,即对给定的图
G(V,E)
,求任意两点
u
,
v
之间的最短路径长度。
●
Floyd
算法基于这样一个事实:如果存在顶点
k
,使得以
k
作为中介点时顶点
i
和顶点
j
的当前最短距离缩短,则使用顶点
k
作为顶点
i
和顶点
j
的中介点,即当
dis[
i
][k]+dis[k][j]<dis[
i
][j]
时,令
dis[
i
][j]=
dis[
i][k]+dis[k][j] (其
中dis[i
][j]
表示从顶点
i
到顶点
j
的最短距离)。
图:
运算结果 :
代码 :
#include<iostream>
#include<vector>
using namespace std;
const int INF=99999;
class Graph {
public:
int N,E;
int type;
vector<vector<int> > g;
Graph(int n=0,int e=0,int type=0) {
N=n;
E=e;
type=type;
g=vector<vector<int> >(N+1,vector<int>(N+1,INF));
}
add(int v,int d,int w=1) {
g[v][d]=w;
if(type==1) {
g[d][v]=w;
}
}
print() {
for(int i=1; i<=N; i++) {
for(int j=1; j<=N; j++) {
cout<<g[i][j]<<" ";
}
cout<<endl;
}
}
};
void floyd(Graph g) {
for(int k=1; k<=g.N; k++) {//中介点
for(int i=1; i<=g.N; i++) {//起点
for(int j=1; j<=g.N; j++) {//终点
if(g.g[i][k]+g.g[k][j]<g.g[i][j])
g.g[i][j]=g.g[i][k]+g.g[k][j];
}
}
}
for(int i=1; i<=g.N; i++) {
g.g[i][i]=0;
}
g.print();
}
int main(void) {
Graph g(4,8,0);
g.add(1,2,2);
g.add(1,3,6);
g.add(1,4,4);
g.add(2,3,3);
g.add(3,1,7);
g.add(3,4,1);
g.add(4,1,5);
g.add(4,3,12);
floyd(g);
return 0;
}