Cod sursa(job #1923092)

Utilizator ioan.adrian98Ioan Adrian ioan.adrian98 Data 10 martie 2017 20:42:01
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <list>

using namespace std;

# define INF 0x3f3f3f3f

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

typedef pair<int, int> iPair;

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

public:
    Graph(int V);

    void addEdge(int u, int v, int w);

    void shortestPath(int s);
};

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

void Graph::addEdge(int u, int v, int w)
{
    adj[u].push_back(make_pair(v, w));
    adj[v].push_back(make_pair(u, w));
}

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

    vector<long> dist(V, INF);

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

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

        list< iPair >::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));
            }
        }
    }

    for (int i = 2; i < dist.size(); i++)
        (dist[i] == INF) ? out << 0  << " " : out << dist[i] << " ";
}

int main()
{
    int V, E;

    in >> V >> E;

    Graph g(V + 1);

    for (int i = 0; i < E; i++)
    {
        int x, y, w;

        in >> x >> y >> w;

        g.addEdge(x, y, w);
    }

    in.close();

    g.shortestPath(1);

    out.close();

    return 0;
}