#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
#define MaxVertexNum 100
#define INF 32767
typedef struct
{
string vertex[MaxVertexNum];
int edges[MaxVertexNum][MaxVertexNum];
int n, e;
} MGraph;

void CreateMGraph(MGraph &G)
{
int i, j, k, p;
cout << "请输入顶点总数:";
cin >> G.n;
cout << "请输入顶点元素:";
for (i = 1; i <= G.n; i++)
{
cin >> G.vertex[i];
}
cout << "请输入边数:";
cin >> G.e;

for (i = 1; i <= G.n; i++)
{
for (j = 1; j <= G.n; j++)
{
G.edges[i][j] = INF;
if (i == j)
{
G.edges[i][j] = 0;
}
}
}
for (k = 1; k <= G.e; k++)
{
cout << "请输入第" << k << "条弧头弧尾序号和相应的权值:";
cin >> i >> j >> p;
G.edges[i][j] = p;
G.edges[j][i] = p;
}
cout << endl
<< endl;
}

void Ppath(MGraph G, int path[][MaxVertexNum], int i, int j)
{
int k;
k = path[i][j];
if (k == -1)
{
return;
}
Ppath(G, path, i, k);
cout << G.vertex[k] << "->";
Ppath(G, path, k, j);
}
void Dispath(MGraph G, int A[][MaxVertexNum], int path[][MaxVertexNum], int n)
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (A[i][j] == INF)
{
if (i != j)
{
cout << "从" << G.vertex[i] << "到" << G.vertex[j] << "没有路径" << endl;
}
}
else
{
if (i != j)
{
cout << "从" << G.vertex[i] << "到" << G.vertex[j] << "=>最短路径路径长度为:";
printf("%3d", A[i][j]);
cout << " 路径:";
cout << G.vertex[i] << "->";
Ppath(G, path, i, j);
cout << G.vertex[j] << endl;
}
}
}
}
}
void Floyd(MGraph G)
{
int A[MaxVertexNum][MaxVertexNum], path[MaxVertexNum][MaxVertexNum];
int i, j, k;
for (i = 1; i <= G.n; i++)
{
for (j = 1; j <= G.n; j++)
{
A[i][j] = G.edges[i][j];
path[i][j] = -1;
}
}
for (k = 1; k <= G.n; k++)
{
for (i = 1; i <= G.n; i++)
{
for (j = 1; j <= G.n; j++)
{
if (A[i][j] > A[i][k] + A[k][j])
{
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
}
}
Dispath(G, A, path, G.n);
}
int main()
{
freopen("input.txt", "r", stdin);
MGraph G;
CreateMGraph(G);
Floyd(G);
return 0;
}


input.txt

5
v1 v2 v3 v4 v5
7
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60


也可以是多起点多终点的问题,因为弗洛伊德算法计算的是任何一个顶点到任何一个顶点的最短路径
/*
28 59
S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18
1 11 220
1 15 210
1 16 420
1 17 80
1 18 420
1 27 260
2 3 310
2 4 380
2 13 450
2 27 300
3 4 390
3 13 460
3 27 450
4 13 160
4 27 360
5 13 210
6 7 200
6 13 180
6 27 480
7 8 200
7 27 300
7 28 300
8 9 200
8 28 290
9 18 500
9 24 130
9 26 80
10 22 160
10 23 140
10 24 70
11 27 220
12 27 200
13 27 280
14 28 180
15 16 270
15 17 270
15 18 270
15 27 150
16 17 140
16 18 140
16 27 360
17 18 70
17 27 240
17 28 180
18 19 120
18 21 90
18 27 360
19 20 120
20 21 120
20 22 190
20 24 215
21 22 160
21 24 150
22 23 160
22 24 95
23 24 130
25 28 200
26 28 290
27 28 60
*/