无向图最短路径C++实现,不用STL容器
时间: 2023-10-20 07:13:51 浏览: 100
c++实现图最短路径
以下是使用 Dijkstra 算法实现无向图最短路径的 C++ 代码,不使用 STL 容器:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f3f;
int dist[MAXN]; // 存储起点到各个顶点的最短距离
bool vis[MAXN]; // 标记顶点是否被访问过
int graph[MAXN][MAXN]; // 存储图的邻接矩阵
void dijkstra(int n, int s)
{
memset(vis, false, sizeof(vis));
for (int i = 1; i <= n; i++)
dist[i] = graph[s][i]; // 初始化起点到各个顶点的距离
vis[s] = true;
dist[s] = 0;
for (int i = 2; i <= n; i++) // 进行 n-1 次循环
{
int minn = INF;
int u;
for (int j = 1; j <= n; j++) // 找到离起点最近的顶点
{
if (!vis[j] && dist[j] < minn)
{
minn = dist[j];
u = j;
}
}
vis[u] = true;
for (int v = 1; v <= n; v++) // 更新与该顶点相邻的顶点的距离
if (!vis[v] && dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
}
int main()
{
int n, m;
cin >> n >> m;
memset(graph, INF, sizeof(graph)); // 初始化邻接矩阵为 INF
for (int i = 1; i <= n; i++)
graph[i][i] = 0; // 自己到自己的距离为 0
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
graph[u][v] = graph[v][u] = w; // 无向图需要对称存储
}
int s;
cin >> s;
dijkstra(n, s);
for (int i = 1; i <= n; i++)
cout << dist[i] << " ";
return 0;
}
```
其中,`graph` 为邻接矩阵,`dist` 存储起点到各个顶点的最短距离,`vis` 用于标记顶点是否被访问过。
阅读全文