Cod sursa(job #2575776)

Utilizator mtud0rTudor M mtud0r Data 6 martie 2020 15:22:38
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include<fstream>
#include<queue>
using namespace std;

const int NLIMIT = 50005;
const int oo = (1 << 30);

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

vector < pair<int, int> > Edges[NLIMIT];

int N, M;

int D[NLIMIT];

bool inQueue[NLIMIT];

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

priority_queue <int, vector<int>, CMP> Q;

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

    int X, Y, C;
    for (int i = 0; i < M; i ++)
    {
        fin >> X >> Y >> C;
        Edges[X].push_back(make_pair(Y, C));
    }
}

void dijkstra()
{
    for (int i = 1; i <= N; i ++)
        D[i] = oo;

    D[1] = 0;
    Q.push(1);
    inQueue[1] = true;

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

        for (int i = 0; i < Edges[Node].size(); i ++)
        {
            int Next = Edges[Node][i].first;
            int Price = Edges[Node][i].second;

            if (D[Node] + Price < D[Next])
            {
                D[Next] = D[Node] + Price;

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

void write()
{
    for (int i = 2; i <= N; i ++)
        if (D[i] != oo)
            fout << D[i] << " ";
        else
            fout << 0 << " ";
}

int main()
{
    read();
    dijkstra();
    write();
    return 0;
}