/* * Function that examines for an opportunity to discover a new shortest path * from u to v, using w. */ void di_examine(int n, int u, int v, int w, float* dist, float* graph, int* p, int* q, std::vector<int>* L, std::vector<int>* R, std::list<int>* bucket_heap, int* b_num, std::list<int>::iterator* iters) { if (dist[u*n + v] + dist[v*n + w] < dist[u*n + w]) { dist[u*n + w] = dist[u*n + v] + dist[v*n + w]; // If it's never been inserted, insert, else decrease. if (p[u*n + w] == -1) { heap_insert(bucket_heap, b_num, u*n + w, dist[u*n + w], n, iters); } else { heap_decrease(bucket_heap, b_num, u*n + w, dist[u*n + w], n, iters); } p[u*n + w] = p[u*n + v]; q[u*n + w] = q[v*n + w]; } }
int main() { int n, m; scanf("%d%d", &n, &m); edge es[2*m]; for (int i = 0; i < m; i++) { int vi, ui, w; scanf("%d%d%d", &vi, &ui, &w); vertex *v = &vs[vi], *u = &vs[ui]; es[2*i] = (edge){u, w, v->a}; v->a = &es[2*i]; es[2*i+1] = (edge){v, w, u->a}; u->a = &es[2*i+1]; } const int inf = (int)1e9; for (vertex *v = vs; v != vs+n; v++) { v->i = v - vs; v->d = inf; v->b = false; heap_insert(v); } int s; scanf("%d", &s); vs[s]->d = 0; for (int i = 0; i < n; i++) { vertex *v = heap_extract(); v->b = true; for (edge *e = v->a; e != NULL; e = e->n) { vertex *u = e->v; if (!u->b && v->d + e->w < u->d) { u->d = v->d + e->w; heap_decrease(u); } } } return 0; }