求每两个顶点之间的最短距离
#include<iostream> using namespace std; #define N 100//最大顶点个数 #define INF 32767 typedef struct//图的邻接矩阵类型 { int edges[N][N]; //邻接矩阵 int vexnum,arcnum; //顶点数,弧数 //int vexs[N];//存放顶点信息---如该顶点的下一个顶点 } MGraph; void DispMG(MGraph g);//输出邻接矩阵 void Floyd(MGraph g);//弗洛伊德算法---计算每对顶点之间的最短路径 void DisPath(int A[][N],int Path[][N],int n);//输出路径 void PPath(int Path[][N],int i,int j); int main() { /*int A[N][6]={ {INF,5,INF,7,INF,INF}, {INF,INF,4,INF,INF,INF}, {8,INF,INF,INF,INF,9}, {INF,INF,5,INF,INF,6}, {INF,INF,INF,5,INF,INF}, {3,INF,INF,INF,1,INF} };*/ int A[N][6]={ {INF,INF,10 ,INF,30 ,100}, {INF,INF,5 ,INF,INF,INF}, {INF,INF,INF,50 ,INF,INF}, {INF,INF,INF,INF,INF,10 }, {INF,INF,INF,20 ,INF,60 }, {INF,INF,INF,INF,INF,INF} }; MGraph g;//实例化邻接矩阵 g.vexnum=6; g.arcnum=10;//6个顶点,10条边 for (int i=0;i<g.vexnum;i++) for (int j=0;j<g.vexnum;j++) g.edges[i][j]=A[i][j]; printf("有向图G的邻接矩阵:\n"); DispMG(g);//输出邻接矩阵 Floyd(g);//调用算法并输出每两点之间的距离 return 0; } void Floyd(MGraph g)//弗洛伊德算法从每对顶点之间的最短路径 { int i,j,k; int Arr[N][N],Path[N][N];//Arr[][]---记录各点间的最小距离,path[][]---记录路径中间节点 for (i=0;i<g.vexnum;i++) for (j=0;j<g.vexnum;j++)//给Arr[][]置初值 { Arr[i][j]=g.edges[i][j];// Path[i][j]=-1;//从i到j中间经过的点为path[][]---没有时为-1 } for (k=0;k<g.vexnum;k++)//中间节点控制---中间节点不大于k(实际上用的就是k) { for (i=0;i<g.vexnum;i++) for (j=0;j<g.vexnum;j++)//遍历Arr[][],看每一个节点经过k点到达所有其他节点的距离有无改善(更小) if (Arr[i][j]>(Arr[i][k]+Arr[k][j])) { Arr[i][j]=Arr[i][k]+Arr[k][j]; Path[i][j]=k;//从顶点i到顶点j的中间点为k } } printf("\n输出最短路径:\n"); DisPath(Arr,Path,g.vexnum); /*输出最短路径*/ } void DisPath(int A[][N],int Path[][N],int n) { int i,j; for (i=0;i<n;i++) for (j=0;j<n;j++) if(A[i][j]==INF) { if(i!=j)//交通路径中---到达自身节点本就是0距离 printf("从%d到%d没有路径\n",i,j); } else { printf("从%d到%d路径长度为:%d",i,j,A[i][j]); printf("\t路径为:");printf("%d,",i);PPath(Path,i,j); printf("%d\n",j); } } void PPath(int Path[][N],int i,int j) { int k=Path[i][j]; if (k==-1) return; PPath(Path,i,k); printf("%d,",k); PPath(Path,k,j); } void DispMG(MGraph g)/*输出邻接矩阵*/ { int i,j; for (i=0;i<g.vexnum;i++) { for (j=0;j<g.vexnum;j++) if (g.edges[i][j]==INF) printf("%4s","∞"); else printf("%4d",g.edges[i][j]); printf("\n"); } }