给定⼀个 n 个点 m 条边的有向图。所有边的⻓度都是1,点的编号为 1 ∼ n 。请求出1号点到 n 号点的最短距离,如果从1号点⽆法⾛到 n 号点,输出-1。 用c++做
时间: 2024-12-24 18:41:06 浏览: 5
这是一个经典的有向图单源最短路径问题,可以使用Dijkstra算法或者Floyd-Warshall算法来解决。这里我会介绍如何使用Dijkstra算法。Dijkstra算法适用于边权重非负的情况,而题目中所有边的长度均为1,所以非常适合。
```cpp
#include <vector>
#include <queue>
using namespace std;
struct Edge {
int to;
int weight; // 在这里我们不需要,因为所有边的权重都是1,但是为了通用性,保留这个结构体字段
};
class Solution {
public:
int shortestDistance(int n, vector<vector<Edge>>& edges) {
vector<int> dist(n + 1, INT_MAX); // 初始化距离数组,所有点到起点的距离设为无穷大
dist[1] = 0; // 起点的距离设置为0
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 使用优先队列存放距离和节点
pq.push({0, 1}); // 入队初始节点(1, 0)
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (u == n) break; // 如果到达了终点n,则退出循环
for (const Edge& edge : edges[u]) {
int v = edge.to;
if (dist[u] + 1 < dist[v]) { // 更新较短的距离
dist[v] = dist[u] + 1;
pq.push({dist[v], v});
}
}
}
return dist[n] == INT_MAX ? -1 : dist[n]; // 如果无法到达n,返回-1,否则返回实际距离
}
};
```
阅读全文