Cod sursa(job #1207433)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 13 iulie 2014 00:10:01
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream ka("dijkstra.in");
ofstream ki("dijkstra.out");
const int N_MAX = 50000;
int distanta[N_MAX + 5];
int n, m, x, y, cost;
class nod
{
    public:
        int index, cost;
        bool operator < (const nod &arg) const
        {
            return cost > arg.cost;
        }
};

vector< vector <nod> >graf(N_MAX + 5);
priority_queue <nod> coada;

void dijkstra()
{
        for(int i = 2; i <= n; i++)
        {
            distanta[i] = 2147000000;
        }
        nod nu;
        nu.index = 1;
        nu.cost = 0;
        coada.push(nu);
        while(!coada.empty())
        {
            nod na = coada.top();
            coada.pop();
            if(na.cost <= distanta[na.index])
            {
                distanta[na.index] = na.cost;
                for(int i = 0; i < graf[na.index].size(); i++)
                {
                    if(na.cost + graf[na.index][i].cost < distanta[graf[na.index][i].index])
                    {
                        distanta[graf[na.index][i].index] = na.cost + graf[na.index][i].cost;
                        nod nn;
                        nn.index = graf[na.index][i].index;
                        nn.cost = distanta[graf[na.index][i].index];
                        coada.push(nn);
                    }
                }
            }
        }
}

int main()
{
    ka >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        ka >> x >> y >> cost;
        nod no;
        no.index = y;
        no.cost = cost;
        graf[x].push_back(no);
        no.index = x;
        graf[y].push_back(no);
    }
    dijkstra();
    for(int i = 2; i <= n; i++)
    {
        if(distanta[i] == 2147000000)
            ki << 0;
        else
            ki << distanta[i];
        ki << " ";
    }
}