本题是求解在给定的图中,从每个起点出发,是否存在一条路径满足所有需求点之间的距离和不超过 'D'。因此,我们可以考虑对于每个起点 'i',使用 Dijkstra 算法求出其到其他所有点的最短路径,并判断是否存在一条路径满足所有需求点的限制。

首先,读入输入数据。使用邻接表存储图的结构,然后读入需求点的位置。

接下来,对于每个起点 'i',我们使用 Dijkstra 算法求出其到其他所有点的最短路径。具体实现中,我们使用一个小根堆维护当前需要更新的点,每次取出距离 'i' 最近的点 'u',然后遍历 'u' 的所有邻居 'v',如果从 'i' 到 'v' 的距离可以通过从 'i' 到 'u' 再到 'v' 的距离更新,则更新 'dist[v]' 的值,并将 'v' 插入堆中。

最后,对于每个需求点 '(s, t)',判断 'dist[s]' 和 'dist[t]' 是否都不为 'INF',并且 'dist[s]+dist[t]<=D'。如果存在一条路径满足需求,则令答案增加 '1'。

最终,输出答案即可。

#include <vector>
#include <queue>
#include <limits>

using namespace std;

const int INF = numeric_limits<int>::max();

void dijkstra(int s, const vector<vector<pair<int, int>>>& adj, vector<int>& dist) {
    int n = adj.size();
    dist.assign(n, INF);
    dist[s] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
    pq.emplace(0, s);

    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();
        if (dist[u] < d) continue;
        for (auto [v, w] : adj[u]) {
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                pq.emplace(dist[v], v);
            }
        }
    }
}

int main() {
    int N, M, T, P, D;
    cin >> N >> M >> T >> P >> D;

    vector<vector<pair<int, int>>> adj(N);
    for (int i = 0; i < M; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }

    vector<pair<int, int>> demands(T);
    for (int i = 0; i < T; i++) {
        int s, t;
        cin >> s >> t;
        demands[i] = {s, t};
    }

    int ans = 0;
    for (int i = 0; i < P; i++) {
        vector<int> dist(N);
        dijkstra(i, adj, dist);
        for (auto [s, t] : demands) {
            if (dist[s] != INF && dist[t] != INF && dist[s] + dist[t] <= D) {
                ans++;
                break;
            }
        }
    }

    cout << ans << endl;

    return 0;
}
Dijkstra 算法求解图中路径满足需求点距离限制

原文地址: https://www.cveoy.top/t/topic/nj0A 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录