为啥0
查看原帖
为啥0
1528036
shiyongyou__1楼主2024/12/27 19:52
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 100010;
int n, m, k, dis[N], vis[N], head[N], cnt;

struct Edge {
    int v, w, next;
} edge[2 * N];

struct Node {
    int dist, id;
    Node(int d = 0, int i = 0) : dist(d), id(i) {}
    bool operator>(const Node& other) const {
        return dist > other.dist;
    }
};

priority_queue<Node, vector<Node>, greater<Node>> q;

void add(int u, int v, int w) {
    edge[++cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt;
}

int main() {
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= m; i++) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
        add(v, u, w);
    }

    while (k--) {
        int x, y;
        scanf("%d%d", &x, &y);
        for (int i = 1; i <= n; i++) {
            dis[i] = 0x3f3f3f3f;
            vis[i] = 0;
        }
        dis[1] = 0;
        q.push(Node(0, 1));
        while (!q.empty()) {
            Node cur = q.top();
            q.pop();
            int u = cur.id;
            if (vis[u]) continue;
            vis[u] = 1;
            for (int i = head[u]; i; i = edge[i].next) {
                int v = edge[i].v, w = edge[i].w;
                if (dis[v] > dis[u] + w) {
                    dis[v] = dis[u] + w;
                    q.push(Node(dis[v], v));
                }
            }
        }
        printf("%d\n", dis[x] + dis[y]);
    }
    return 0;
}
2024/12/27 19:52
加载中...