Ejemplo n.º 1
0
/*
 * 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;
}