Cod sursa(job #594881)

Utilizator nandoLicker Nandor nando Data 10 iunie 2011 12:03:38
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;

#define min(a, b) (((a) < (b)) ? (a) : (b))

#define INF 0x3f3f3f3f
#define MAXN 50010

int n, m, dist[MAXN];

vector <pair <int, int> > g[MAXN];
typedef vector <pair <int, int> >::iterator iter;

void dijkstra (int source, int* dest)
{
    for (int i = 1; i <= n; ++i) {
        dest[i] = INF;
    }

    dest[source] = 0;

    bitset <MAXN> viz;
    priority_queue <pair <int, int> > q;
    q.push (make_pair (0, source));

    while (!q.empty ()) {
        int nd = q.top ().second;
        viz[nd] = true;
        q.pop ();

        for (iter it = g[nd].begin (); it != g[nd].end (); ++it) {
            if (!viz[it->first] && dest[nd] + it->second < dest[it->first]) {
                dest[it->first] = dest[nd] + it->second;
                q.push (make_pair (-dest[it->first], it->first));
            }
        }
    }
}

int main ()
{
    FILE* fin = fopen ("dijkstra.in", "r");
    FILE* fout = fopen ("dijsktra.out", "w");

    fscanf (fin, "%d %d\n", &n, &m);

    for (int i = 1; i <= m; ++i) {
        int x, y, z;
        fscanf (fin, "%d %d %d\n", &x, &y, &z);

        g[x].push_back (make_pair (y, z));
        g[y].push_back (make_pair (x, z));
    }

    dijkstra (1, dist);

    for (int i = 2; i <= n; ++i) {
        fprintf (fout, "%d ", dist[i] == INF ? 0 : dist[i]);
    }

    fclose (fin);
    fclose (fout);
    return 0;
}