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: Time Limit Exceeded)

#include <iostream>
#include <vector>
#include <unordered_set>
#include <set>

using namespace std;

const int Inf = 10000 * 100000 + 100;

// ????¢?????????????????????§, ????????????????°??????????????????¢??¢?´¢??????
inline int linear_search(const set<int>& st, const vector<int>& cost){
  int ans = *st.begin();
  int min_cost = Inf;
  for(const auto u: st){
    if(cost[u] < min_cost){
      ans = u;
      min_cost = cost[u];
    }
  }
  return ans;
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  int V,E,R;
  cin >> V >> E >> R;
  vector<int> s(E),t(E),d(E);
  vector<vector<int> > edge(V);
  for(int i = 0; i < E; ++i){
    cin >> s[i] >> t[i] >> d[i];
    edge[s[i]].emplace_back(i);
  }
  vector<int> cost(V, Inf);
  cost[R] = 0;

  set<int> q;
  for(int i = 0; i < V; ++i){
    q.emplace(i);
  }

  while(!q.empty()){
    // ?¢?????????????????????? u ??¨??????
    int u = linear_search(q, cost);
    q.erase(u);

    for(auto i : edge[u]){
      // u ????§??????§?¢????????????§???????????????????????????????????????
      // ????????? v ??¨??????.
      int v = t[i];
      if(q.find(v) != q.end()){
        // ????????§?????????????????????
        if(cost[u] + d[i] < cost[v]){
          cost[v] = cost[u] + d[i];
        }
      }
    }
  }

  for(int i = 0; i < V; ++i){
    if(cost[i] == Inf)
      cout << "INF";
    else
      cout << cost[i];

    cout << endl;
  }
}