最短路径——Floyd

来源:互联网 发布:ios gif制作软件 编辑:程序博客网 时间:2024/05/23 15:47

头文件"AdjGraph.h"

#include<iostream>#include<stack>#define INFINITY 0x3f3f3f3fusing 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;}


原创粉丝点击