dijkstra单源最短路

dijkstra算法用于计算图中某一点到其他各点的最短路径,要求各路径的权值不能为负。

算法流程

设图中共有n个点,记源点为s,d[i]表示从s到i的最短路径长度。

例题:单源最短路

struct HeapNode {
    int idx, dst;
    bool operator<(const HeapNode &o) const {
        return dst > o.dst;
    }
};
int n, m, S, T, d[1005], vis[1005];
vector<pair<int,int> > g[1005];
priority_queue<HeapNode> q;
int main() {
    int a, b, c;
    scanf("%d%d%d%d", &n, &m, &S, &T);
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &a, &b, &c);
        g[a].push_back(make_pair(b, c));
        g[b].push_back(make_pair(a, c));
    }
    for (int i = 1; i <= n; i++) d[i] = INT_MAX;
    q.push((HeapNode){S, 0});
    while (!q.empty()) {
        HeapNode t = q.top(); q.pop();
        int x = t.idx;
        if (vis[x]) continue;
        vis[x] = 1; d[x] = t.dst;
        for (auto i : g[x]) if (!vis[i.first])
            q.push((HeapNode){i.first, d[x] + i.second});
    }
    printf("%d\n", d[T]);
    return 0;
}

如果除了最短路径外,还需要求出最短路线,可以设置fa数组,将节点加入优先队列时把父节点标号也一并写入,在更新d数组时记录节点的父节点,最后逆序输出即可。

Table of Contents