头文件”AdjGraph.h”
#include<iostream>
#include<stack>
#define INFINITY 0x3f3f3f3f
using namespace std;
class AdjGraph{
public:
int **edge;//边的权
int **path;//path[v][u]的值表示从v到u的最短路径中,中间编号不大于vertexNum的u的前驱顶点编号
int vertexNum,edgeNum;//顶点数目,边数目
AdjGraph(int v){
vertexNum=v;
edgeNum=0;
edge=new int* [vertexNum];
for(int i=0;i<vertexNum;i++)
edge[i]=new int [vertexNum];
path=new int* [vertexNum];
for(int i=0;i<vertexNum;i++)
path[i]=new int [vertexNum];
//初始化边和最短路径
for(int i=0;i<vertexNum;i++)
for(int j=0;j<vertexNum;j++){
edge[i][j]=INFINITY;
path[i][j]=-1;
}
}
~AdjGraph(){
for(int i=0;i<vertexNum;i++)
delete [] edge[i];
delete edge;
for(int i=0;i<vertexNum;i++)
delete [] path[i];
delete path;
}
void setedge(int v,int u,int weight){
edge[v][u]=weight;
path[v][u]=v;
edgeNum++;
}
void Floyd(){
//注意循环的嵌套顺序,如果把检查所有节点k放在最内层,那么结果将是不正确的.
//因为这样便过早的把i到j的最短路径确定下来了,而当后面存在更短的路径时,已经不再会更新了.
for(int k=0;k<vertexNum;k++)
for(int i=0;i<vertexNum;i++)
for(int j=0;j<vertexNum;j++)
if(edge[i][j]>edge[i][k]+edge[k][j]){
edge[i][j]=edge[i][k]+edge[k][j];
path[i][j]=k;
}
}
void show(){
//因为输出最短路径时是从后往前的顺序得到路径,所以用栈来保存并输出
stack<int> st;
int tmp;
for(int i=0;i<vertexNum;i++)
for(int j=0;j<vertexNum;j++)
if(edge[i][j]!=INFINITY&&i!=j){
cout<<"v"<<i<<"->"<<"v"<<j<<":"<<edge[i][j]<<'\t';
tmp=j;
st.push(j);
while(path[i][tmp]!=i){
tmp=path[i][tmp];
st.push(tmp);
}
st.push(i);
cout<<"v"<<st.top();
st.pop();
while(!st.empty()){
cout<<"->"<<"v"<<st.top();
st.pop();
}
cout<<endl;
}
}
};
源文件”main.cpp”
#include<iostream>
#include"AdjGraph.h"
using namespace std;
int main(){
AdjGraph AG(3);
AG.setedge(0,1,10);
AG.setedge(0,2,5);
AG.setedge(1,0,9);
AG.setedge(1,2,6);
AG.setedge(2,0,2);
AG.setedge(2,1,13);
AG.Floyd();
AG.show();
return 0;
}