/**
@多源最短路径
@author 狂热的codeer
*/
#include <iostream>
#include <cstdio>
#define MAX 63355
#define N 20
typedef char Elemtype;
typedef int Status;
typedef struct Graph{
Elemtype vexs[N]; //顶点
Status arcs[N][N]; //边的权值
int V,E; //顶点与边
int path[N];
}Graph;
void Create_Graph(Graph &G){
printf("输入顶点与边数目:\n") ;
scanf("%d%d",&G.V,&G.E);
int v = G.V,e = G.E;
for(int i = 0;i<v;i++){ /*初始化*/
for(int j = 0;j<v;j++)
G.arcs[i][j] = MAX;
}
printf("输入边值:\n") ;
for(int i = 0;i<v;i++){/*输入边值*/
scanf("%c",&G.vexs[i]);
getchar();
}
printf("输入边的下标以及权值:\n") ;
int w,index1,index2;
for(int i = 0;i<e;i++){ /*输入权值以及边对应下标*/
scanf("%d%d%d",&index1,&index2,&w);
G.arcs[index1][index2] = w;
}
}
void Floyed(Graph &G){
for(int k = 0;k<G.V;k++){ //用于探索的点置于最外层
for(int i = 0;i<G.V;i++){
for(int j = 0;j<G.V;j++){
if(G.arcs[i][j]>G.arcs[i][k]+G.arcs[k][j])
G.arcs[i][j] = G.arcs[i][k]+G.arcs[k][j];
}
}
}
for(int i = 0;i<G.V;i++){ /*矩阵形式输出各顶点的最短路径*/
for(int j = 0;j<G.V;j++){
if(G.arcs[i][j]!=MAX){
printf("%d\t",G.arcs[i][j]);
}else{
printf("oo\t"); //非最短路径处标志位无穷
}
}
printf("\n");
}
}
void Path(Graph &G){
while(true){
int i,j;
printf("输入查询的两顶点的下标:\n") ;
scanf("%d%d",&i,&j);
/*输出两顶点的最短路径长*/
for(int k = 0;k<G.V;k++){
if(G.arcs[i][j]<MAX&&G.arcs[i][k]+G.arcs[k][j]<G.arcs[i][j]){
G.arcs[i][j] = G.arcs[i][k]+G.arcs[k][j]; }}
int item = G.arcs[i][j];printf("%d->%d最短路径长为:%d\n",i,j,item);
}
}
int main(int argc, char** argv) {
Graph G;
Create_Graph(G);
Floyed(G);
Path(G);
return 0;
}
多源最短路径(Floyed算法)
最新推荐文章于 2025-02-08 18:33:44 发布