Cod sursa(job #591625)
#include<queue>
#include<cstdio>
#include<vector>
using namespace std;
#define INFINIT 0x3f3f3f3f
typedef vector<int> VI;
struct muchie {
int c, t;
}a;
vector<muchie> c[50001];
int n, m, d[50001];
struct cmp {
bool operator()(const int &a, const int &b) const{
if(d[a] > d[b]) return 1;
return 0;
}
};
priority_queue<int, VI, cmp> heap;
void dijkstra(int sursa) {
int k, i;
memset(d, INFINIT, sizeof(d));
d[sursa] = 0;
heap.push(sursa);
while( !heap.empty() ) {
k = heap.top();
heap.pop();
for(i = 0; i < c[k].size(); ++i)
if(d[c[k][i].t] > d[k] + c[k][i].c) {
d[c[k][i].t] = d[k] + c[k][i].c;
heap.push(c[k][i].t);
}
}
}
int main() {
int i, m1, m2, cost;
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
scanf("%d%d", &n, &m);
while(m--) {
scanf("%d%d%d", &m1, &m2, &cost);
a.t = m2; a.c = cost;
c[m1].push_back(a);
}
dijkstra(1);
for(i = 2; i <= n; ++i) {
if(d[i] == INFINIT)
printf("0");
else printf("%d", d[i]);
if(i != n)
printf(" ");
}
printf("\n");
return 0;
}