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: Accepted)

#include<stdio.h>
#include<stdlib.h>

#define MAX 10001
#define INFTY (1<<20)
#define WHITE 0
#define GRAY 1
#define BLACK 2
#define NIL -1

struct node{
	struct node *next;
	int v;
	int h;
};

typedef struct node *NodePointer;
NodePointer nil;

NodePointer data[MAX];
int d[MAX];
int color[MAX];
int pi[MAX];

void create_node(int r, int v, int c){
	NodePointer n;
	n =(NodePointer)malloc(sizeof(struct node));
	n->v = v;
	n->h = c;
	n->next = data[r]->next;
	data[r]->next = n;

}

int main( void ){
	
	int ex;
	int i , j;
	int n , u , k , v , c , r;
	int uid;
	int mc;
	
	for( i = 0; i < MAX; i++ ){
		data[i] = (NodePointer)malloc(sizeof(struct node));
		data[i]->v = INFTY;
		data[i]->h = INFTY;
		data[i]->next  = NULL;
	}
	
	scanf( "%d" , &n );
	
	for( i = 1; i <= n; i++ ){
		
		d[i] = INFTY;
		color[i] = WHITE;
		pi[i] = NIL;
		
		scanf( "%d%d" , &uid , &k );
		r = uid;
		for( j = 0; j < k; j++ ){
		scanf( "%d%d" , &v , &c );
		create_node( r , v , c );
	    }
	}
	
	d[0] = 0;
	
	for( ex = 0; ; ex++ ){
		mc = INFTY;
		for( j = 0; j < n; j++ ){
			if( color[j] != BLACK && d[j] < mc ){
				mc = d[j];
				u = j;
			}
		}
		
		if( mc == INFTY ){
			break;
		}

		color[u] = BLACK;
		    
		nil = data[u]->next; 
		    
		while(nil != NULL){
			if(color[nil->v] != BLACK && d[u]+nil->h<d[nil->v]){
				pi[nil->v] = u;
				d[nil->v] = nil->h+d[u];
			}
			nil = nil->next;
		}
	}
	
	for( i = 0; i < n; i++ ){
		printf("%d %d\n",i,d[i]);
	}
		
	return 0;
}