Cod sursa(job #596770)

Utilizator floringh06Florin Ghesu floringh06 Data 19 iunie 2011 14:11:56
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#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;
}