Floyed算法求两点之间的最短路径
2013-06-17 11:42
726 查看
#include <iostream> using namespace std; #define MAXNODE 500//最大顶点个数 #define Inf 65535//无穷大 typedef int vertype; struct VerNode { vertype vertex;//// 顶点信息,可以是字母表示,也可以是数字表示 //.....;//// 和顶点相关的其它信息,如顶点的度 }; struct Arc { int adj;// 两顶点之间是否存在关系,用1或0表示相邻否;如果是带权图,则为权值类型 //....;// 和弧(或边)相关的信息,如弧头、弧尾 }; struct MGraph//图的邻接矩阵表示类型 { VerNode vex[MAXNODE];//顶点向量 Arc arcs[MAXNODE][MAXNODE];//邻接矩阵 int vexnum,arcnum;//图的当前顶点数和弧数 }; int sum=0;//保存所走路径的花费 MGraph CreatMGraph(MGraph g)//创建邻接矩阵 { int n; cout<<"输入顶点个数:"<<endl; cin>>n; cout<<"输入顶点信息"<<endl; for(int i=0;i<n;i++) { cin>>g.vex[i].vertex; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { g.arcs[i][j].adj=Inf;//初始化邻接矩阵,各顶点间无路 } } int i,j,quan,e=0; cout<<"边依附的顶点和权值(两顶点全为0就结束)"<<endl; cin>>i>>j;//输入一条边依附顶点的序号 cin>>quan; while(i||j)//两顶点全为0就结束 { e++; g.arcs[i][j].adj=quan; g.arcs[i][i].adj=0;//各顶点到自己的距离为0 g.arcs[j][j].adj=0;//各顶点到自己的距离为0 cin>>i>>j;cin>>quan; } g.vexnum=n; g.arcnum=e; return g; } void getPath(int path[][MAXNODE],int v,int u); void Floyd(MGraph g)//floyd算法求两点之间的最短路径 { //A-1[i][j]=cost[i][j] //Ak+1[i][j]=MIN{Ak[i][j],Ak[i][k+1]+Ak[k+1][j]} (0≤k≤n-2) int A[MAXNODE][MAXNODE],path[MAXNODE][MAXNODE];//A数组保存最短路径的长度,path保存最短路径 int i,j,k; for(i = 0;i<g.vexnum;i++)//初始化A数组和path数组 { for(j = 0;j<g.vexnum;j++) { A[i][j]=g.arcs[i][j].adj; path[i][j]=-1; } } for(k=0;k<g.vexnum;k++)//修改最短路径及其长度 { for(i=0;i<g.vexnum;i++) { for(j=0;j<g.vexnum;j++) { if(A[i][j]>A[i][k]+A[k][j]) { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } } } for(i=0;i<g.vexnum;i++) { for(j=0;j<g.vexnum;j++) { cout<<i<<"到"<<j<<"的最短路径为:"; if(A[i][j]==Inf) cout<<i<<"不能到达"<<j; else getPath(path,i,j); cout<<j<<endl; cout<<"路径长度为:"; cout<<A[i][j]<<endl;; } } } void getPath(int path[][MAXNODE],int v,int u)//v到u的最短路径 { cout<<v<<" "; if(path[v][u]!=-1)getPath(path,path[v][u],u); } int main() { cout<<"以邻接矩阵的形式输入图的信息"<<endl; MGraph g= CreatMGraph(g); cout<<"邻接矩阵建立成功"<<endl; Floyd(g); return 0; }
相关文章推荐
- 两点之间最短路径算法(Single-Dijkstra-shortest path)
- 使用广度遍历算法寻找两点之间的最短路径
- 算法-两点之间最短路径
- Flyod 算法(两两之间的最短路径)
- 16. 求两点之间的最短路径
- 求两点之间最短路径-Dijkstra算法
- 图的邻接链表实现下的搜索两点之间所有路径的算法
- ACM-Floyed算法求两点之间的最短路径
- 动态规划---->每对定点之间的最短路径 Floyd(弗洛伊德)算法
- 弗洛伊德算法得到图中任意两个顶点之间的最短路径
- 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
- LCA算法求任意两个节点之间的最小公共祖先(最短路径)
- 动态规划---->每对定点之间的最短路径 Floyd(弗洛伊德)算法
- 【算法导论】每对顶点之间的最短路径算法
- 暑假训练专题三 bellman-ford 求两点之间的最短路径
- 最短路径问题平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。
- 【算法导论】每对顶点之间的最短路径算法
- Floyed 算法求最短路径
- 【算法导论】【Floyd-Warshall 算法】每对节点之间的最短路径
- Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离