用邻接矩阵实现floyd找最短路算法
测试所用图如下:
#include<string.h> #include<string> #include<algorithm> #include<cmath> #include<stdio.h> #include<iostream> #include<set> #define inf 65535 using namespace std; struct Graph//用邻接矩阵来保存图 { int arc[100][100]; int vertex[100]; int num_ver,num_edge; }; typedef int PathMatirx[100][100];//用来记录路径 typedef int ShortPathTable[100][100];//用来记录各点到各点的最短距离 void create(Graph *g)//建立邻接矩阵 { scanf("%d%d",&g->num_ver,&g->num_edge); int i,j,y,x,z; for(i=0;i<g->num_ver;i++)//输入顶点 scanf("%d",&g->vertex[i]); for(i=0;i<g->num_ver;i++)//邻接矩阵初始化 { for(j=0;j<g->num_ver;j++) { if(i==j)g->arc[i][j]=0; else g->arc[i][j]=inf; } } for(i=0;i<g->num_edge;i++)//输入边的信息 { scanf("%d%d%d",&x,&y,&z); g->arc[x][y]=z; g->arc[y][x]=z; } } void shortpath(Graph *g,PathMatirx *p,ShortPathTable *d) {//求最短路及其路径 int v,w,k; for(v=0;v<g->num_ver;v++){ for(w=0;w<g->num_ver;w++){ (*d)[v][w]=g->arc[v][w]; (*p)[v][w]=w; } } for(k=0;k<g->num_ver;k++){ for(v=0;v<g->num_ver;v++) { for(w=0;w<g->num_ver;w++) { if((*d)[v][w]>(*d)[v][k]+(*d)[k][w]){ (*d)[v][w]=(*d)[v][k]+(*d)[k][w]; (*p)[v][w]=(*p)[v][k]; } } } } //以下一段是测试用 for(int i=0;i<g->num_ver;i++){ for(int j=0;j<g->num_ver;j++) printf("%5d ",(*d)[i][j]); printf(" "); } } void ShowPath(Graph *g,PathMatirx *p,ShortPathTable *d,int x,int y){ int v,w,tmp; for(w=0;w<g->num_ver;w++) printf("*%d ",(*d)[x][w]);//打印起始点到各点的最短距离 printf(" "); printf("%d",x);//打印起点 v=(*p)[x][y]; while(v!=y){ printf("->%d",v); v=(*p)[v][y]; } printf("->%d ",y);//打印终点 } int main(){ int i,j,k; Graph G; create(&G); ShortPathTable d; PathMatirx p; shortpath(&G,&p,&d); /*for(i=0;i<G.num_ver;i++){ for(j=0;j<G.num_ver;j++) printf("%d ",d[i][j]); printf(" "); } for(i=0;i<G.num_ver;i++){ for(j=0;j<G.num_ver;j++) printf("%d ",p[i][j]); printf(" "); } ShowPath(&G,&p,&d,1,7); return 0; } /* 9 16 0 1 2 3 4 5 6 7 8 0 1 1 0 2 5 1 3 7 1 4 5 1 2 3 2 4 1 2 5 7 3 6 3 3 4 2 4 6 6 4 7 9 4 5 3 5 7 5 6 8 7 6 7 2 7 8 4 */
ShortPathTable矩阵里[v][w]代表v到w的最短距离
在PathMatirx矩阵里找v到x路径时,就打印相应的那一列,比如说0->8,则从0
开始按索引打印到8.
(图来自<<大话数据>>一书)
测试结果如下图: