Cod sursa(job #1978867)

Utilizator icansmileSmileSmile icansmile Data 8 mai 2017 23:14:18
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
// Program to find Dijkstra's shortest path using
// priority_queue in STL
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#include <list>
#include <vector>
#include <queue>

using namespace std;
# define INF 0x3f3f3f3f

FILE *input = fopen("dijkstra.in","r");
FILE *output = fopen("dijkstra.out","w");

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];
}

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

void Graph::shortestPath(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));
            }
        }
    }

    for (int i = 1; i < V; ++i)
        fprintf(output, "%d ", dist[i]);
}

int main() {
    int n,m;

    fscanf(input, "%d %d", &n, &m);

    Graph graph(n);

    for(int i = 0; i < m; i++) {
        int x, y, cost;
        fscanf(input,"%d %d %d",&x,&y,&cost);
        graph.addEdge(x - 1,y - 1,cost);
    }

   graph.shortestPath(0);

    fclose(input);
    fclose(output);

    return 0;
}