Cod sursa(job #1007075)

Utilizator Theorytheo .c Theory Data 8 octombrie 2013 09:41:50
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

const int Nmax = 50007;
const int Inf = (1<<30);

int N; int M;

vector < pair <int, int> > G[Nmax];

void Read() {

    fin >> N >> M;

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

        fin >>A >> B >> C;
        G[A].push_back(make_pair(B, C));
    }

}


void Initialize(int MinDistance[], int S ) {

    for(int i = 0 ;i <= N  ; ++i) MinDistance[i] = Inf;

    MinDistance[S] = 0;
}



int* Dijkstra(int Sursa) {

    int MinDistance[Nmax];

    priority_queue < pair <int, int> , vector < pair <int, int> >, greater < pair <int, int> > > Q;

    Initialize(MinDistance, Sursa);
    Q.push( make_pair(0 , 1));

    while( !Q.empty()) {

        int Node = Q.top().second;
        int C = Q.top().first;

        Q.pop();

        for(int i = 0 ; i < G[Node].size(); ++i) {

            if(MinDistance[G[Node][i].first] > C + G[Node][i].second) {

                MinDistance[G[Node][i].first] = C + G[Node][i].second;

                Q.push(make_pair(MinDistance[G[Node][i].first], G[Node][i].first) );
            }
        }
    }

    return MinDistance;
}


void Write(int Distance[]) {

    for(int i = 2; i <= N; ++i)
        if(Distance[i] == Inf)
            fout << 0 << " ";
        else fout << Distance[i] << " ";

}

int main() {

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

    fin.close();

    return 0;
}