Cod sursa(job #2476409)

Utilizator nTropicGravityesadasdwaadwqafr nTropicGravity Data 18 octombrie 2019 19:51:54
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include    <fstream>
#include    <vector>
#include    <queue>

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

#define ARRAY_MAX 250005

int N, M;
int Dist[ARRAY_MAX];
bool inQueue[ARRAY_MAX];
const int upperBound = 1 << 30;

struct Compare {
    bool operator() (int X, int Y) {
        return Dist[X] > Dist[Y];
    }
};

vector < pair < int, int > > Node[ARRAY_MAX];
priority_queue < int, vector < int >, Compare > Queue;

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

    while (M--) {
        int A, B, C;
        fin >> A >> B >> C;

        Node[A].push_back(make_pair(B, C));
    }
}

void Dijkstra(int startNode) {
    for (int i = 1; i <= N; i++)
        Dist[i] = upperBound;

    Dist[startNode] = 0;
    Queue.push(startNode);
    inQueue[startNode] = true;

    while (!Queue.empty()) {
        int currentNode = Queue.top();
        Queue.pop();
        inQueue[currentNode] = false;

        for (auto it : Node[currentNode]) {
            int Next = it.first;
            int Cost = it.second;

            if (Dist[Next] > Dist[currentNode] + Cost) {
                Dist[Next] = Dist[currentNode] + Cost;

                if (!inQueue[Next]) {
                    Queue.push(Next);
                    inQueue[Next] = true;
                }
            }
        }
    }
}

void Write() {
    for (int i = 2; i <= N; i++)
        fout << ((Dist[i] != upperBound) ? Dist[i] : 0) << " ";
}

int main() {
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    Read();
    Dijkstra(1);
    Write();
}