#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;
}
Floyed算法求两点之间的最短路径
最新推荐文章于 2021-12-05 22:19:20 发布