Dijkstra ship new wording

Synchronization: https://buringstraw.win/index.php/archives/49/

Dijkstra Well, that is not a time to find the shortest path from a fixed point in the shortest shortest known point, then it will be fixed, and update the other points of the shortest point connection. The very beginning, source to source point 0 is the shortest.
So, review it again Dijkstraand then found a few functions

  • make_heap (first, last, comp) : An array mess to a heap
  • push_heap (first, last, comp) : Let the end of the array of floating and to heap correct position
  • pop_heap (first, last, comp) : HeapguiHead thrown into the end of the array

So what is the simple packaging

void push (int x) {
    heap[++hsize] = x;
    std::push_heap(heap + 1, heap + 1 + hsize, cmp1);
}
void pop (void) {
    std::pop_heap(heap + 1,heap + 1 + hsize--, cmp1);
}

Run with a heap array implementationThan in Hong Kong reporters alsofast,Than the vectorpriority queue implementation does not know where to go up.
Figure

Template title code is as follows

#include <cstdio>
#include <algorithm>

const int MAXM = 500000 + 5, MAXN = 100000 + 5, INF = 2147483647;

int n, m, s;

struct ed {
    int to, nex, w;
} e[MAXM];

int head[MAXN], dis[MAXN], hsize;
bool v[MAXN];
int newp;

struct node {
    int id, v;
} heap[MAXN];

void insert (int p1, int p2, int w) {
    ++newp;
    e[newp].to = p2;
    e[newp].w = w;
    e[newp].nex = head[p1];
    head[p1] = newp;
}

bool cmp1 (node x, node y) {
    return x.v > y.v;
}

void push (node x) {
    heap[++hsize] = x;
    std::push_heap(heap + 1, heap + 1 + hsize, cmp1);
}

void pop (void) {
    std::pop_heap(heap + 1,heap + 1 + hsize--, cmp1);
}

void dij (int s) {
    for (int i = 1; i <= n; ++i) {
        dis[i] = INF;
        v[i] = 0;
    }
    dis[s] = 0;
    hsize = 0;
    push((node){s, 0});
    
    while (hsize) {
        node u = heap[1];
        pop();
        if (v[u.id]) continue;//已固定的点 
        v[u.id] = 1;
        for (int i = head[u.id]; i; i = e[i].nex) {
            int y = e[i].to;
            if (dis[y] > u.v + e[i].w) {
                dis[y] = u.v + e[i].w;
                push((node){y, dis[y]});
            }
        }
    }
}

int main (void) {
    scanf("%d%d%d", &n, &m, &s);
    
    for (int i = 1; i <= n; ++i) {
        head[i] = 0;
        heap[i] = (node){0, 0};
    }
    
    for (int i = 1; i <= m; ++i) {
        e[i] = (ed){0, 0, 0};
    }
    
    {
        int p1, p2, w;
        for (int i = 1; i <= m; ++i) {
            scanf("%d%d%d", &p1, &p2, &w);
            insert(p1, p2, w);
        }
    }
    
    dij(s);
    
    for (int i = 1; i <= n; ++i) {
        printf("%d ", dis[i]);
    }
    putchar('\n');
    
    return 0;
}

Guess you like

Origin www.cnblogs.com/buringstraw/p/11374116.html