Cod sursa(job #1976377)

Utilizator maryan_lupMarian Lupascu maryan_lup Data 3 mai 2017 11:13:23
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<bits/stdc++.h>
#define INF INT_MAX

using namespace std;

typedef pair<int, int> iPair;

class Graph
{
private:
    int V;
    list< pair<int, int> > *adj;

public:
    Graph(int V);
    void addEdge(int, int, int);
    void Dijkstra(int);
};

Graph::Graph(int V)
{
    this->V = V;
    adj = new list <iPair> [V];
}

void Graph::addEdge(int a, int b, int c)
{
    adj[a].push_back(make_pair(b, c));
    //adj[b].push_back(make_pair(a, c));
}

void Graph::Dijkstra(int src)
{
    priority_queue< iPair, vector <iPair> , greater<iPair> > pq;

    vector <int> dist(V, INF);

    pq.push(make_pair(0, src));
    dist[src] = 0;

    while (!pq.empty())
    {
        int u = pq.top().second;
        pq.pop();

        list< pair<int, int> >::iterator i;
        for (i = adj[u].begin(); i != adj[u].end(); ++i)
        {
            int v = (*i).first;
            int weight = (*i).second;

            if (dist[v] > dist[u] + weight)
            {
                dist[v] = dist[u] + weight;
                pq.push(make_pair(dist[v], v));
            }
        }
    }

    ofstream out("dijkstra.out");
    for (int i = 2; i < V; ++i)
        if(dist[i] == INF)
            out<<0<<" ";
        else
            out<<dist[i]<<" ";
    out.close();
}

void citire()
{
    ifstream fin("dijkstra.in");
    int V, E, a, b, c;
    fin>>V>>E;
    Graph g(V+1);
    for(int i = 1; i <= E; i++)
    {
        fin>>a>>b>>c;
        g.addEdge(a, b, c);
    }
    g.Dijkstra(1);
    fin.close();
}

int main()
{

    citire();

    return 0;
}