Pagini recente » Cod sursa (job #1017950) | Cod sursa (job #1756409) | Cod sursa (job #1417741) | Cod sursa (job #1347907) | Cod sursa (job #1290327)
#include <cstdio>
#include <queue>
#include <bitset>
#include <algorithm>
#define son first
#define cost second
using namespace std;
typedef pair <int, int> graph_node;
const int NMAX = 50002, INFI = 2e9;
int dist[NMAX], N;
struct predicate {
inline bool operator () (const graph_node &a, const graph_node &b) {
return b.cost < a.cost;
}
};
vector <graph_node> G[NMAX];
priority_queue <graph_node, vector <graph_node>, predicate> Q;
void dijkstra (const int &start_node) {
int node, cst, i;
for (i = 1; i <= N; ++i)
dist[i] = INFI;
dist[start_node] = 0;
Q.push (make_pair (start_node, 0));
while (!Q.empty ()) {
node = Q.top ().son;
cst = Q.top ().cost;
Q.pop ();
if (dist[node] != cst)
continue;
for (vector <graph_node> :: iterator i = G[node].begin (); i != G[node].end (); ++i)
if (i->cost + dist[node] < dist[i->son]) {
dist[i->son] = i->cost + dist[node];
Q.push (make_pair (i->son, dist[i->son]));
}
}
for (i = 2; i <= N; ++i)
printf ("%d ", dist[i] == INFI ? 0 : dist[i]);
}
int main () {
freopen ("dijkstra.in", "r", stdin);
freopen ("dijkstra.out" , "w", stdout);
int M, a, b, c;
scanf ("%d%d", &N, &M);
while (M--) {
scanf ("%d%d%d", &a, &b, &c);
G[a].push_back (make_pair (b, c));
}
dijkstra (1);
}