Floyd最短路


用邻接矩阵实现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.


(图来自<<大话数据>>一书)



测试结果如下图:


原文地址:https://www.cnblogs.com/hjch0708/p/7554823.html