📄 shortestpath.cpp
字号:
#include<iostream>
using namespace std;
#define INFINITY 1000
#define MAX_VERTEX_NUM 20
#define True 1
#define FALSE 0
struct MGraph{
char vexs[MAX_VERTEX_NUM];
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
};
int LocateVex(MGraph &G, char ch){
int i,k;
for(i=0;i<G.vexnum;++i)
{
if(ch==G.vexs[i])
k=i;
}
return k;
}
void CreateGraph(MGraph &G){
int i,j,k,w;
char v1,v2;
cout<<"请输入该图的结点数和弧数:";
cin>>G.vexnum>>G.arcnum;
cout<<"请输入图的顶点向量:";
for(i=0;i<G.vexnum;i++)
cin>>G.vexs[i];
for(i=0;i<G.vexnum;i++){
for(j=0;j<G.vexnum;j++)
G.arcs[i][j] =INFINITY;
G.arcs[i][i]=0;
}
for(k=0;k<G.arcnum;k++){
cout<<"请输入一条边依附的顶点及权值"<<endl;
cin>>v1>>v2>>w;
i=LocateVex(G,v1); j=LocateVex(G,v2);
G.arcs[i][j]=w;
G.arcs[j][i]=G.arcs[i][j];
}
cout<<"--------初始邻接矩阵---------"<<endl;
for(i=0;i<G.vexnum;i++){
for(j=0;j<G.vexnum;j++)
cout<<G.arcs[i][j]<<" ";
cout<<endl;
}
}
//void ShortestPath_FLOYD(MGraph G,char P[20][20][20],int D[20][20])
void ShortestPath_FLOYD(MGraph G,int D[20][20])
{
int a[20];
int v,u,w;
for(v=0;v<G.vexnum;v++)//-------D(-1)-------
{
for(w=0;w<G.vexnum;w++)
{
D[v][w]=G.arcs[v][w];
/* for (u=0;u<G.vexnum;u++)
P[v][w][u]=NULL;
if (D[v][w]!=20000)
{
P[v][w][v]=True;
P[v][w][w]=True;
}*/
}
}
for(u=0;u<G.vexnum;u++)
{
for(v=0;v<G.vexnum;v++)
{
for(w=0;w<G.vexnum;w++)
{
if (D[v][u]+D[u][w]<D[v][w])
D[v][w]=D[v][u]+D[u][w];
/*for(i=0;i<G.vexnum;i++)
{
P[v][w][i]=P[v][u][i]||P[u][w][i];
}*/
}
}
}
cout<<"-------顶点间最短路径矩阵--------"<<endl;
for(v=0;v<G.vexnum;v++)
{
for(w=0;w<G.vexnum;++w)
cout<<D[v][w]<<" ";
cout<<endl;
}
/*for(v=0;v<G.vexnum;v++)
{
for(u=0;u<G.vexnum;u++)
{
for(w=0;w<G.vexnum;w++)
{
cout<<P[v][u][w]<<" ";
}
cout<<endl;
}
}*/
for(v=0;v<G.vexnum;v++)
{
int count1=1;
a[v]=0;
for(w=0;w<G.vexnum;w++)
{
if(a[v]<D[v][w]&&D[v][w]<INFINITY){
a[v]=D[v][w];
//++count1;
count1=w+1;
}
}
cout<<"若选择第"<<v+1<<"个村庄建医院,与它距离最远的村庄是第"<<count1<<"个村庄,路程是"<<a[v]<<endl;
}
int min=a[0];
int count2=0;
for(v=0;v<G.vexnum;v++)
{
if(min>=a[v]){
min=a[v];
++count2;
}
}
cout<<"在第"<<count2<<"个村庄建医院可使离医院最远的村庄到医院的路程最短"<<endl;
cout<<"其最短路径是:"<<min<<endl;
}
void main (){
MGraph G;
CreateGraph(G);
int D[20][20];
ShortestPath_FLOYD(G,D);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -