This documentation is automatically generated by online-judge-tools/verification-helper
// verification-helper: PROBLEM http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A
#include <bits/stdc++.h>
using namespace std;
#define call_from_test
#include "../../datastructure/radixheap.cpp"
#undef call_from_test
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
int n,m,r;
cin>>n>>m>>r;
using P = pair<int, int>;
vector< vector<P> > G(n);
for(int i=0;i<m;i++){
int s,t,d;
cin>>s>>t>>d;
G[s].emplace_back(t,d);
}
const int INF = numeric_limits<int>::max();
RadixHeap<int, int> pq;
vector<int> dist(n,INF);
dist[r]=0;
pq.emplace(dist[r],r);
while(!pq.empty()){
P p=pq.pop();
int v=p.second;
if(dist[v]<p.first) continue;
for(auto& e:G[v]){
int u=e.first,c=e.second;
if(dist[u]>dist[v]+c){
dist[u]=dist[v]+c;
pq.emplace(dist[u],u);
}
}
}
for(int i=0;i<n;i++){
if(dist[i]==INF) cout<<"INF\n";
else cout<<dist[i]<<"\n";
}
cout<<flush;
return 0;
}
#line 1 "test/aoj/GRL_1_A.test.cpp"
// verification-helper: PROBLEM http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A
#include <bits/stdc++.h>
using namespace std;
#define call_from_test
#line 1 "datastructure/radixheap.cpp"
#line 3 "datastructure/radixheap.cpp"
using namespace std;
#endif
//BEGIN CUT HERE
// prohibited to push an element less than popped one
// Key: int or long long
template<typename K,typename V>
struct RadixHeap{
inline static constexpr int bit = sizeof(K) * 8;
array<vector< pair<K, V> >, bit> vs;
int size;
K last;
RadixHeap():size(0),last(0){}
bool empty() const{return size==0;}
inline int getbit(int a){
return a?bit-__builtin_clz(a):0;
}
inline int getbit(long long a){
return a?bit-__builtin_clzll(a):0;
}
void emplace(K key,V val){
size++;
vs[getbit(key^last)].emplace_back(key,val);
}
pair<K, V> pop(){
if(vs[0].empty()){
int idx=1;
while(vs[idx].empty()) idx++;
last=min_element(vs[idx].begin(),vs[idx].end())->first;
for(auto &p:vs[idx]) vs[getbit(p.first^last)].emplace_back(p);
vs[idx].clear();
}
--size;
auto res=vs[0].back();
vs[0].pop_back();
return res;
}
};
//END CUT HERE
#ifndef call_from_test
//INSERT ABOVE HERE
signed main(){
return 0;
}
#endif
#line 8 "test/aoj/GRL_1_A.test.cpp"
#undef call_from_test
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
int n,m,r;
cin>>n>>m>>r;
using P = pair<int, int>;
vector< vector<P> > G(n);
for(int i=0;i<m;i++){
int s,t,d;
cin>>s>>t>>d;
G[s].emplace_back(t,d);
}
const int INF = numeric_limits<int>::max();
RadixHeap<int, int> pq;
vector<int> dist(n,INF);
dist[r]=0;
pq.emplace(dist[r],r);
while(!pq.empty()){
P p=pq.pop();
int v=p.second;
if(dist[v]<p.first) continue;
for(auto& e:G[v]){
int u=e.first,c=e.second;
if(dist[u]>dist[v]+c){
dist[u]=dist[v]+c;
pq.emplace(dist[u],u);
}
}
}
for(int i=0;i<n;i++){
if(dist[i]==INF) cout<<"INF\n";
else cout<<dist[i]<<"\n";
}
cout<<flush;
return 0;
}