Cod sursa(job #2247148)

Utilizator BreakAllPogonaru Stefan BreakAll Data 27 septembrie 2018 22:17:00
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#define infinit (1<<30)
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int main()
{
    int n, m , *tata, *costuri;
    bool *vizitat;
    priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > pq;
    vector<pair<int,int> > *adiacenta;
    fin >> n >> m;
    adiacenta = new vector<pair<int,int> >[n+1];
    vizitat = new bool[n+1]();
    tata = new int[n+1]();
    costuri = new int[n+1];
    for(int i = 1 ; i <= n ; i++){
        pq.push(make_pair(infinit,i));
        costuri[i] = infinit;
    }
    for(int i = 0 ; i < m ; i++){
        int x,y,cost;
        fin >> x >> y >> cost;
        adiacenta[x].push_back(make_pair(cost,y));
        adiacenta[y].push_back(make_pair(cost,x));
    }
    //fin >> start >> destinatie;
    costuri[1] = 0;
    pq.push(make_pair(0, 1));
    while(!pq.empty()){
        int nod_curent = pq.top().second;
        vizitat[nod_curent] = 1;
        for(int i = 0 ; i < adiacenta[nod_curent].size() ; i++){
            if(vizitat[adiacenta[nod_curent][i].second] == 0 && pq.top().first + adiacenta[nod_curent][i].first < costuri[adiacenta[nod_curent][i].second]){
                tata[adiacenta[nod_curent][i].second] = nod_curent;
                costuri[adiacenta[nod_curent][i].second] = pq.top().first + adiacenta[nod_curent][i].first;
                pq.push(make_pair(costuri[adiacenta[nod_curent][i].second], adiacenta[nod_curent][i].second));
            }
        }
        pq.pop();
    }
       for(int i = 2 ; i <= n ; i++)
        fout << costuri[i] << ' ';
    return 0;
}