用邻接矩阵实现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("\n");
}
}
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("\n");
printf("%d",x);//打印起点
v=(*p)[x][y];
while(v!=y){
printf("->%d",v);
v=(*p)[v][y];
}
printf("->%d\n",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("\n");
}
for(i=0;i<G.num_ver;i++){
for(j=0;j<G.num_ver;j++)
printf("%d ",p[i][j]);
printf("\n");
}
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.
(图来自<<大话数据>>一书)
测试结果如下图: