4-4用弗洛伊德算法求赋权图中任意两点间的最短路径
question
完整代码
#include <iostream>
#include <vector>
struct Graph
{
std::vector<int> vertex;
std::vector<std::vector<int>> arcs;
int vexnum = 0, arcnum = 0;
};
void CreateGraph(Graph &G);
void FloydPath(Graph G, std::vector<std::vector<int>> &dist, std::vector<std::vector<int>> &path);
void getPath(int start_node, int end_node, std::vector<std::vector<int>> &path);
int main()
{
Graph G;
CreateGraph(G);
std::vector<std::vector<int>> dist;
std::vector<std::vector<int>> path;
FloydPath(G, dist, path);
int m, start_node, end_node;
std::cin >> m;
for (auto i = 0; i < m; ++i)
{
std::cin >> start_node >> end_node;
getPath(start_node, end_node, path);
}
system("pause");
return 0;
}
void CreateGraph(Graph &G)
{
int n;
std::cin >> n;
G.vexnum = n;
G.arcs.resize(n, std::vector<int>(n, 0));
for (auto i = 0; i < G.vexnum; ++i)
{
for (auto j = 0; j < G.vexnum; ++j)
{
std::cin >> n;
G.arcs[i][j] = n;
}
}
}
void FloydPath(Graph G, std::vector<std::vector<int>> &dist, std::vector<std::vector<int>> &path)
{
int n = G.vexnum;
dist.resize(n, std::vector<int>(n, 0));
path.resize(n, std::vector<int>(n, 0));
for (auto i = 0; i < n; ++i)
{
for (auto j = 0; j < n; ++j)
{
dist[i][j] = G.arcs[i][j];
path[i][j] = j;
}
}
for (auto i = 0; i < n; ++i)
{
for (auto start = 0; start < n; ++start)
{
for (auto end = 0; end < n; ++end)
{
if (dist[start][end] > dist[start][i] + dist[i][end])
{
dist[start][end] = dist[start][i] + dist[i][end];
path[start][end] = path[start][i];
}
}
}
}
}
void getPath(int start_node, int end_node, std::vector<std::vector<int>> &path)
{
int mid_node = start_node;
while (mid_node != end_node)
{
std::cout << mid_node << std::endl;
mid_node = path[mid_node][end_node];
}
std::cout << end_node << std::endl;
}