Cod sursa(job #1971718)

Utilizator Y0da1NUME JMECHER Y0da1 Data 20 aprilie 2017 21:27:33
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define alot 2e9

using namespace std;
int n, m;
class nod{
public:
    int id;
    vector <pair <int, int> > vecini;
};
class cmp{
public:
    bool operator () (pair <nod, int> p1, pair <nod, int> p2)
    {
    return p1.second > p2.second;
    }

};

priority_queue <pair <nod, int>,
                vector<pair <nod, int> >,
                cmp> Q;

vector <nod> G ;
vector <int> dist;
vector <bool> vizitat;

int main()
{
    int i, x, y, z, minim, minpoz, neviz;
    ifstream g ("dijkstra.in");
    ofstream h ("dijkstra.out");
    nod curr;
    g>>n>>m;
    neviz = n-1;

    G.resize(n+1);
    vizitat.resize(n+1);
    dist.resize(n+1);

    for(i=0;i<m;i++)
    {
        g>>x>>y>>z;
        G[x].vecini.push_back(make_pair(y, z));
        G[x].id = x;

    }
    dist[1]=0;
    for(i=2;i<=n;++i)
        dist[i]=alot;
    Q.push(make_pair(G[1], dist[1]));
    while (neviz)
    {
        /*for (i=1;i<=n;++i)
            cout<<dist[i]<<" ";
        cout<<endl;*/
        //minim=alot;
        curr = Q.top().first;
        Q.pop();
        if(dist[curr.id]==alot)
            break;
        if(vizitat[curr.id])
            {
                Q.pop();
                continue;
            }
        /*for(i=1;i<=n;++i)
            if(minim > dist[i] && !vizitat[i])
            {
                minim = dist[i];
                minpoz = i;
            }
        if (minim == alot)      //toate nodurile sunt unreachable
            break;
        vizitat[minpoz]=1;*/
        vizitat[curr.id]=1;
        --neviz;

        for (i = 0; i<curr.vecini.end() - curr.vecini.begin();++i)
            if(dist[curr.id] + curr.vecini[i].second < dist[curr.vecini[i].first])
            {
                dist[curr.vecini[i].first] = dist[curr.id] + curr.vecini[i].second;
                Q.push(make_pair(G[curr.vecini[i].first], dist[curr.vecini[i].first]));
            }


    }
    for (i=2;i<=n;++i)
    {
        if(dist[i]==alot)
            h<<"0 ";
        else
            h<<dist[i]<<" ";
    }
}