Pagini recente » Cod sursa (job #391291) | Cod sursa (job #907784) | Cod sursa (job #1948827) | Cod sursa (job #2130700) | Cod sursa (job #596770)
Cod sursa(job #596770)
#include <map>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cfloat>
#include <numeric>
using namespace std;
const int oo = 0x3f3f3f3f;
const double eps = 1e-9;
typedef long long ll;
typedef vector<int> vi;
typedef vector<string> vs;
typedef pair<int, int> pii;
#define sz(c) int ((c).size())
#define all(c) (c).begin(), (c).end()
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORD(i, a, b) for (int i = (b) - 1; i >= (a); --i)
#define FORIT(i, c) for (__typeof__((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define mp make_pair
#define pb push_back
#define MAX_N 50005
vector<pii> adj[MAX_N];
int D[MAX_N];
int N, M;
void dijkstra (int start) {
FOR (i, 0, N) D[i] = oo;
D[start] = 0;
set<pii> pq;
pq.insert (mp(0, start));
while (!pq.empty()) {
int node = pq.begin()->second;
pq.erase (pq.begin());
FOR (i, 0, sz(adj[node])) {
if (D[node] + adj[node][i].second >= D[adj[node][i].first]) continue;
if (D[adj[node][i].first] < oo)
pq.erase (pq.find(mp(D[adj[node][i].first], adj[node][i].first)));
D[adj[node][i].first] = D[node] + adj[node][i].second;
pq.insert (mp(D[adj[node][i].first], adj[node][i].first));
}
}
FOR (i, 0, N) if (i != start) printf ("%d ", D[i] == oo ? 0 : D[i]);
printf ("\n");
}
int main () {
freopen ("dijkstra.in", "r", stdin);
freopen ("dijkstra.out", "w", stdout);
scanf ("%d %d", &N, &M);
FOR (i, 0, M) {
int x, y, c;
scanf ("%d %d %d", &x, &y, &c);
--x, --y;
adj[x].pb(mp(y, c));
}
dijkstra (0);
return 0;
}