4-1求赋权图中一个结点到所有结点的最短路径的长度
question
![在这里插入图片描述](https://img-blog.csdnimg.cn/1a374ce2b65e4dc78231b58f778c5dd3.png)
完整代码
#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);
std::vector<int> DijkstraPath(Graph G, int start);
int main()
{
Graph G;
CreateGraph(G);
std::vector<int> result;
int start = 0;
result = DijkstraPath(G, start);
for (auto i = 0; i < G.vexnum; ++i)
{
std::cout << result[i] << 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);
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];
}
flag[middle] = true;
}
return dist;
}