请使用dijkstra解决如下c++问题:有 n 个点,编号从 1 到 n,其中有 k 个点是关键点,还有 m 条有向边,每条有向边连接一对点,问相距最近的一对关键点的距离。(单向可达即可) 数据范围:2 <= k <= n <= 100000,m <= min(100000,n(n - 1) / 2)
时间: 2024-04-12 08:27:52 浏览: 77
好的,以下是使用 Dijkstra 算法解决该问题的 C++ 代码:
```cpp
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
struct Edge {
int destination;
int weight;
};
int dijkstra(int n, int k, vector<vector<Edge>>& graph) {
vector<int> distances(n + 1, INT_MAX); // 初始化距离为无穷大
vector<bool> visited(n + 1, false);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
// 将所有关键点加入优先队列
for (int i = 1; i <= k; i++) {
distances[i] = 0;
pq.push({0, i});
}
while (!pq.empty()) {
int curr = pq.top().second;
pq.pop();
if (visited[curr]) {
continue;
}
visited[curr] = true;
for (const auto& edge : graph[curr]) {
int next = edge.destination;
int weight = edge.weight;
if (!visited[next] && distances[curr] + weight < distances[next]) {
distances[next] = distances[curr] + weight;
pq.push({distances[next], next});
}
}
}
int minDistance = INT_MAX;
// 找到相距最近的一对关键点的距离
for (int i = 1; i <= k; i++) {
minDistance = min(minDistance, distances[i]);
}
return minDistance;
}
int main() {
int n, k, m;
cin >> n >> k >> m;
vector<vector<Edge>> graph(n + 1);
for (int i = 0; i < m; i++) {
int source, destination, weight;
cin >> source >> destination >> weight;
graph[source].push_back({destination, weight});
}
int minDistance = dijkstra(n, k, graph);
cout << minDistance << endl;
return 0;
}
```
这段代码使用了邻接表来表示有向图,其中 `n` 表示点的数量,`k` 表示关键点的数量,`m` 表示有向边的数量。`graph` 是一个二维向量,用于存储图的边信息。通过 Dijkstra 算法计算出相距最近的一对关键点的距离,并输出结果。
阅读全文