Problem:
Single Source Shortest Path

For a given weighted graph G(V, E) and a source r, find the source shortest path to each vertex from the source (SSSP: Single Source Shortest Path).

Input

An edge-weighted graph G (V, E) and the source r.

|V| |E| r
s0 t0 d0
s1 t1 d1
:
s|E|-1 t|E|-1 d|E|-1

|V| is the number of vertices and |E| is the number of edges in G. The graph vertices are named with the numbers 0, 1,..., |V|-1 respectively. r is the source of the graph.

si and ti represent source and target vertices of i-th edge (directed) and di represents the cost of the i-th edge.

Output

Print the costs of SSSP in the following format.

c0
c1
:
c|V|-1

The output consists of |V| lines. Print the cost of the shortest path from the source r to each vertex 0, 1, ... |V|-1 in order. If there is no path from the source to a vertex, print INF.

Constraints

1 ≤ |V| ≤ 100000

0 ≤ di ≤ 10000

0 ≤ |E| ≤ 500000

There are no parallel edges

There are no self-loops

Sample Input 1

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

Sample Output 1

0
1
3
4

Sample Input 2

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

Sample Output 2

3
0
2
INF

Solution in C++14 (judge verdict: Accepted)

#include <bits/stdc++.h>
#define MODNum 1000000007
#define WHITE  0
#define GRAY   1
#define BLACK  2
#define INFTY  2147483647
#define REP(type, i, a, b) for( type i = a; i < b; i++ )
typedef long long ll;

using namespace std;

int main (void) {
    ll N, E, r;
    scanf("%lld %lld %lld", &N, &E, &r);
    int u,v,k;
    //ll c[N][N];    /* 辺の重みを記録した隣接行列 */
    ll d[N];       /* 最短コストの記録 */
    priority_queue<pair<ll,ll>> pq;
    //int p[N];       /* 最短経路木における頂点vの親 */
    int weight;
    vector< vector<pair<ll,ll>> > G(N);

    /* Initialization */
    for ( int i = 0; i < N; i++ ){
        d[i]     = INFTY;
        if ( r == i ){
            pq.push(make_pair(0,i));
            d[i] = 0;
        }
        else{
            pq.push(make_pair(-INFTY,i));
        }
        //p[i]  =  -1;
        //for ( int j = 0; j < N; j++ ) c[i][j] = INFTY;
    }
    /* グラフを読み込み */
    for ( int i = 0; i < E; i++ ){
            scanf("%d %d %d", &u, &v, &weight);
            //c[u][v] = weight;
            G[u].push_back( make_pair(weight, v) );
    }

    while ( !pq.empty() ){
        pair<ll,ll> edgepair  =  pq.top();
        pq.pop();
        u                       =  edgepair.second;
        if ( d[u] < -edgepair.first ) continue;
        //for ( v = 0; v < N; v++ ){
            for ( auto& e:G[u])
          //  if ( c[u][v] != INFTY ){
                if ( d[e.second]    > d[u] + e.first ){
                    d[e.second]     = d[u] + e.first;
                    //p[v]     = u;
                    pq.push(make_pair(-d[e.second],e.second));
                }
            //}
        //}
    }

    for ( int i = 0; i < N; i++ ){
        if ( d[i] != INFTY )
            printf("%d\n", d[i]);
        else printf("INF\n");
    }

    return 0;
}