用C++实现给定⼀个 n 个点 m 条边的有向图。所有边的⻓度都是1,点的编号为 1 ∼ n 。请求出1号点到 n 号点的最短距离,如果从1号点⽆法⾛到 n 号点,输出-1。
时间: 2024-12-25 13:28:20 浏览: 68
在C++中,我们可以使用迪杰斯特拉(Dijkstra's Algorithm)来解决这个问题,它是一种用于寻找图中最短路径的算法。对于有向图,特别是每条边长度都为1的情况,这里只需关注边的方向和起点终点即可。以下是基本步骤:
1. 初始化:创建一个大小为n+1的优先队列(如`std::priority_queue`),将所有节点的距离设为无穷大,除了源点(节点1)设为0。
2. 主循环:从优先队列中取出当前距离最小的节点。检查这个节点的所有出边,如果目标节点(节点n)可达,则更新其距离为当前节点的距离加1;同时将目标节点加入队列(若之前未加入)。
3. 边查找:遍历每个邻接节点,检查边是否从已访问节点指向当前节点,并更新其距离。
4. 检查结束条件:当队列为空且未找到从1到达n的路径时,返回-1表示无法达到。
5. 结果存储:最后,1号点到n号点的最短距离就是n号点在优先队列中的距离。
下面是一个简单的伪代码示例:
```cpp
#include <vector>
#include <queue>
int dijkstra(int n, std::vector<std::pair<int, int>>& edges) {
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> pq;
std::vector<int> distances(n + 1, INT_MAX);
distances[1] = 0;
for (const auto& edge : edges) {
if (distances[edge.first] != INT_MAX && distances[edge.first] + 1 < distances[edge.second]) {
distances[edge.second] = distances[edge.first] + 1;
pq.push({distances[edge.second], edge.second});
}
}
if (distances[n] == INT_MAX)
return -1; // 无法到达
return distances[n];
}
```
阅读全文