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 ENORMOUS (1<<21)

struct Ver{
	int weight;
	int key;
	struct Ver *next;
};

void Input(int);
void Create_Vertex(int,int,int);
void SSSP(void);
int Test_Set(int*);
int Heap(int*);

int n;
int *d;
struct Ver *ver;

int main(void){
	int i;
	int id;

	scanf("%d",&n);

	d=(int*)malloc(sizeof(int)*n);
	ver=(struct Ver*)malloc(sizeof(struct Ver)*n);
	for(i=0;i<n;i++){
		ver[i].weight=-1;
		ver[i].key=-1;
		ver[i].next=NULL;
	}

	for(i=0;i<n;i++){
		scanf("%d",&id);
		Input(id);	
	}

	SSSP();

	for(i=0;i<n;i++) printf("%d %d\n",i,d[i]);

	free(d);

	return 0;
}

void Input(int id){
	int k,u,c;
	int i;

	scanf("%d",&k);

	for(i=0;i<k;i++){
		scanf("%d",&u);
		scanf("%d",&c);
		Create_Vertex(id,u,c);
	}
}

void Create_Vertex(int id,int u,int c){
	struct Ver *new,*work;

	new=(struct Ver*)malloc(sizeof(struct Ver));
	new->next=NULL;
	new->weight=c;
	new->key=u;

	work=&ver[id];
	while(work->next!=NULL) work=work->next;
	work->next=new;

}

void SSSP(void){
	int S[n];
	int i;
	int s,u;
	struct Ver *work;

	for(i=0;i<n;i++){
		S[i]=0;
		d[i]=ENORMOUS;
	}
	s=0;
	d[s]=0;

	while(Test_Set(S)==0){
		u=Heap(S);
		S[u]=1;

		work=ver[u].next;
		while(work != NULL){
			if(S[work->key]==1){}
			else if(d[u]+work->weight < d[work->key]){
				d[work->key]=d[u]+work->weight;
			}
			work=work->next;
		}
	}
}

int Heap(int *S){
    int i;
    int min=ENORMOUS;
    int u;
 
    for(i=0;i<n;i++){
        if(S[i]==1) continue;
         
        if(d[i]<min){
            min=d[i];
            u=i;
        }
    }
 
    return u;
}

int Test_Set(int *S){
	int i;

	for(i=0;i<n;i++){
		if(S[i]==0) return 0;
	}
	return 1;
}