4-3用弗洛伊德算法求赋权图的两点间的最短路径的长度
question
完整代码
#include <iostream>
#include <vector>
#define INF 10000
struct Graph
{
std::vector<int> vertex;
std::vector<std::vector<int>> arcs;
int vexnum = 0, arcnum = 0;
};
void CreateGraph(Graph &G);
void Floyd(Graph G, std::vector<std::vector<int>> &dist);
int main()
{
Graph G;
CreateGraph(G);
std::vector<std::vector<int>> dist;
Floyd(G, dist);
int m, start, end;
std::cin >> m;
for (auto i = 0; i < m; ++i)
{
std::cin >> start >> end;
std::cout << dist[start][end] << std::endl;
}
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 Floyd(Graph G, std::vector<std::vector<int>> &dist)
{
int n = G.vexnum;
dist.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];
}
}
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];
}
}
}
}
}