Cod sursa(job #2154828)

Utilizator DenisPetreCsRekkles DenisPetre Data 7 martie 2018 12:36:28
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

const int NMax=50001;
const int oo=(1 << 30);

int N,M;
int D[NMax];
bool inCoada[NMax];

vector <pair <int,int> > Muchii[NMax];

struct compara{
bool operator()(int x, int y)
    {
        return D[x]>D[y];
    }
};

priority_queue<int, vector <int> , compara> Coada;

void citeste()
{
    f>>N>>M;
    for(int i;i<=N;i++)
    {
        int x,y,c;
        f>>x>>y>>c;
        Muchii[x].push_back(make_pair(y,c));
    }
}

void afiseaza()
{
    for(int i=2;i<=M;i++)
    {
        if(D[i]!=oo)
            g<<D[i]<<" ";
        else
            g<<"0 ";
    }
}

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

    D[nod_start]=0;

    Coada.push(nod_start);
    inCoada[nod_start]=true;
    while(!Coada.empty())
    {
        int nodCurent=Coada.top();
        Coada.pop();

        inCoada[nodCurent]=false;
        for(size_t i=0;i<Muchii[nodCurent].size();i++)
        {int vecin=Muchii[nodCurent][i].first;
         int cost=Muchii[nodCurent][i].second;

         if(D[nodCurent]+cost<D[vecin])
         {
             D[vecin]=D[nodCurent]+cost;
             if(inCoada[vecin]==false)
             {
                 Coada.push(vecin);
                 inCoada[vecin]=true;
             }
         }
        }

    }
}

int main()
{
    citeste();
    dijkstra(1);
    afiseaza();
    return 0;
}