Cod sursa(job #2148073)

Utilizator vladrares10Raducu Vlad-Rares vladrares10 Data 1 martie 2018 15:16:23
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <cstring>

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

const int INF = 0x3f3f3f3f;
const int NMAX = 100002;

int main()
{
    int n,m,p;
    fin >> n >> m;
    /// citim cele 'n' noduri care au 'm' muchii si casa 'p' a lui Vlad

    vector<pair<int,int> > G[NMAX]; /// creem graful

    for(int i = 1; i <= m; i++)
        /// citim cele m muchii
    {
        int from,to,cost;
        fin >> from >> to >> cost;

        G[from].push_back(make_pair(cost,to));
    }

    int dist[NMAX]; /// creem vectorul cu distantele pana la casa lui Vlad
    memset(dist, INF, sizeof dist); /// initializam distantele pe infinit

    dist[1] = 0; /// distanta pana la casa lui Vlad este de 0

    set<pair<int,int> > heap; ///creem heap-ul
    heap.insert(make_pair(0,1)); /// primul element este casa lui Vlad

    while(!heap.empty())
    {
        int d = heap.begin() ->first;
        int node = heap.begin() ->second;
        heap.erase(heap.begin());
        /// dupa ce am extras datele primului element le stergem

        vector<pair<int,int> >::iterator it;
        for(it = G[node].begin(); it != G[node].end(); ++it)
        {
            int cost = it ->first;
            int to = it ->second;

            if(dist[to] > dist[node] + cost)
            {
                if(dist[to] != INF)
                    heap.erase(heap.find(make_pair(dist[to],to)));
                ///daca exista deja un drum minim pana la nodul 'to' il stergem pentru ca am gasit unul mai bun

                dist[to] = dist[node] + cost;
                heap.insert(make_pair(dist[to],to));
            }


        }
    }

    for(int i = 1; i <= n; i++)
        if(dist[i] == INF)
            dist[i] = 0;

    for(int i = 2; i <= n; i++)
        fout << dist[i] << " ";


    return 0;
}