question
完整代码
#include <iostream>
#include <vector>
#include <stack>
#define INF 10000
struct Graph
{
std::vector<int> vertex;
std::vector<std::vector<int>> arcs;
int vexnum = 0, arcnum = 0;
};
void CreateGraph(Graph &G);
std::vector<int> DijkstraPath(Graph G, int start);
int main()
{
Graph G;
CreateGraph(G);
std::vector<int> result;
int start, end;
std::cin >> start >> end;
result = DijkstraPath(G, start);
std::stack<int> S;
int path = end;
while (path != start)
{
S.push(result[path]);
path = result[path];
}
while (!S.empty())
{
std::cout << S.top() << std::endl;
S.pop();
}
std::cout << 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;
}
}
}
std::vector<int> DijkstraPath(Graph G, int start)
{
int n = G.vexnum;
std::vector<int> dist(n, 0);
std::vector<bool> flag(n, false);
std::vector<int> path(n, start);
flag[start] = true;
for (auto i = 0; i < n; ++i)
dist[i] = G.arcs[start][i];
for (auto i = 0; i < n; ++i)
{
int min_dist = INF;
int middle = 0;
for (auto j = 0; j < n; ++j)
{
if (!flag[j] && min_dist > dist[j])
{
middle = j, min_dist = dist[j];
}
}
for (auto j = 0; j < n; ++j)
{
if (!flag[j] && dist[j] > dist[middle] + G.arcs[middle][j])
dist[j] = dist[middle] + G.arcs[middle][j], path[j] = middle;
}
flag[middle] = true;
}
return path;
}