Cod sursa(job #1569711)

Utilizator CollermanAndrei Amariei Collerman Data 15 ianuarie 2016 20:59:44
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
ofstream fout("dijkstra.out");
ifstream fin("dijkstra.in");

const int NMAX = 50005;

int N, M, INF = 1e7;

vector<pair<int, int>> Graf[NMAX];
bitset<NMAX> Viz;
int Drum[NMAX];

struct cmp {
    bool operator() (const pair<int, int> & a, const pair<int, int> & b) { return a.second > b.second; }
};

priority_queue< pair<int, int>, vector<pair<int, int>>, cmp > q;

void citire()
{
    fin >> N >> M;

    for(int i = 1, x, y, c; i <= M; i++)
    {
        fin >> x >> y >> c;
        Graf[x].push_back(make_pair(y, c));
        Graf[y].push_back(make_pair(x, c));
    }
}

void dijkstra(int nod)
{
    Viz.reset();
	fill(Drum + 1, Drum + N + 1, INF);
    Drum[nod] = 0;
    q.push({nod, 0});

    while(!q.empty()) {
        int sursa = q.top().first;
        q.pop();

        if(Viz[sursa]) continue;
        Viz[sursa] = true;

        for(const auto & nodCurent : Graf[sursa]) {
            if(Drum[nodCurent.first] > Drum[sursa] + nodCurent.second) {
                Drum[nodCurent.first] = Drum[sursa] + nodCurent.second;
                q.push(nodCurent);
            }
        }
    }
}

int main()
{
	citire();
	dijkstra(1);
	for(int i = 1; i <= N; i++)
		fout << ( (Drum[i] != INF) ? Drum[i] : 0 ) << ' ';
	return 0;
}