Cod sursa(job #2088649)

Utilizator alex99Chelba Alexandru alex99 Data 15 decembrie 2017 17:11:10
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;
#define MAX 50010
#define inf 1000000000
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
class dijkstra
{
    list<pair<int, int> > *arc;
    int n;
public:
    dijkstra(int n);
    void drum(int s);
    void adaugare(int x, int y, int c);
};
dijkstra::dijkstra(int n)
{
    this->n=n+1;
    arc=new list<pair<int,int> > [n+1];
}
void dijkstra::adaugare(int x, int y, int c)
{
    arc[x].push_back({y,c});
}
void dijkstra::drum(int src)
{
    priority_queue< pair<int,int> , vector< pair<int,int> >, greater< pair<int,int> > > pq;
    vector<int> dist(n,inf);
    dist[src]=0;
    pq.push(make_pair(0,src));
    while(pq.size())
    {
        int nod=pq.top().second;
        pq.pop();
        for(auto it : arc[nod])
            if(dist[nod]+it.second < dist[it.first])
            {
                dist[it.first]=dist[nod]+it.second;
                pq.push({dist[it.first], it.first});
            }
    }
    for(int i=2;i<n;i++)
        if(dist[i]!=inf) g<<dist[i]<<" ";
            else g<<0<<" ";
    g<<'\n';
}
int main()
{
    int n,m,x,y,c;
    f>>n>>m;
    dijkstra grf(n);
    for(int i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        grf.adaugare(x,y,c);
    }
    grf.drum(1);
    return 0;
}