Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Single Source Shortest Path II

For a given weighted graph $G = (V, E)$, find the shortest path from a source to each vertex. For each vertex $u$, print the total weight of edges on the shortest path from vertex $0$ to $u$.

Input

In the first line, an integer $n$ denoting the number of vertices in $G$ is given. In the following $n$ lines, adjacency lists for each vertex $u$ are respectively given in the following format:

$u$ $k$ $v_1$ $c_1$ $v_2$ $c_2$ ... $v_k$ $c_k$

Vertices in $G$ are named with IDs $0, 1, ..., n-1$. $u$ is ID of the target vertex and $k$ denotes its degree. $v_i (i = 1, 2, ... k)$ denote IDs of vertices adjacent to $u$ and $c_i$ denotes the weight of a directed edge connecting $u$ and $v_i$ (from $u$ to $v_i$).

Output

For each vertex, print its ID and the distance separated by a space character in a line respectively. Print in order of vertex IDs.

Constraints

$1 \leq n \leq 10,000$

$0 \leq c_i \leq 100,000$

$|E| < 500,000$

All vertices are reachable from vertex $0$

Sample Input 1

5
0 3 2 3 3 1 1 2
1 2 0 2 3 4
2 3 0 3 3 1 4 1
3 4 2 1 0 1 1 4 4 3
4 2 2 1 3 3

Sample Output 1

0 0
1 2
2 2
3 1
4 3

Reference

Introduction to Algorithms, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. The MIT Press.

Solution in C (judge verdict: Memory Limit Exceeded)

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
int *dist, *prev, *visit, **matrix;
void Dijkstra(int, int);
main()
{
        int i, j, n, u, k, v, c;
        scanf("%d", &n);
        dist = (int*)malloc(sizeof(int) * n);
        prev = (int*)malloc(sizeof(int) * n);
        visit = (int*)malloc(sizeof(int) * n);
        matrix = (int**)malloc(sizeof(int*) * n);
        for (i = 0; i < n; i++) {
                matrix[i] = (int*)malloc(sizeof(int) * n);
                for (j = 0; j < n; j++) {
                        matrix[i][j] = -1;
                }
        }
        for (i = 0; i < n; i++) {
                scanf("%d%d", &u, &k);
                for (j = 0; j < k; j++) {
                        scanf("%d%d", &v, &c);
                        matrix[u][v] = c;
                }
                dist[i] = INT_MAX;
                prev[i] = -1;
                visit[i] = 0;
        }
        Dijkstra(0, n);
        for (i = 0; i < n; i++) {
                printf("%d %d\n", i, dist[i]);
                free(matrix[i]);
        }
        free(matrix);
        free(dist);
        free(prev);
        free(visit);

}
void Dijkstra(int p, int size)
{
        dist[p] = 0;
        while (1) {
                int i, u = -1, min = INT_MAX;
                for (i = 0; i < size; i++) {
                        if (!visit[i] && dist[i] < min) {
                                u = i;
                                min = dist[i];
                        }
                }
                if (u == -1) break;
                visit[u] = 1;
                for (i = 0; i < size; i++) {
                        if (matrix[u][i] >= 0) {
                                int w = matrix[u][i], newlen = dist[u] + w;
                                if (newlen < dist[i]) {
                                        dist[i] = newlen;
                                        prev[i] = u;
                                }
                        }
                }
        }
}