Cod sursa(job #1693314)

Utilizator vlad_andrei.ursuUrsu Vlad-Andrei vlad_andrei.ursu Data 22 aprilie 2016 20:57:18
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <iostream>
#include <fstream>
#include <list>
#include <vector>
#include <queue>
#include <functional>

#define SIZE 100
#define INF 32000

/* Define globally */
std::vector<std::pair<long, long> > graph[SIZE];
long dist[SIZE];
bool marked[SIZE];                  // initially false, which is OK

void print_graph(long nr_vert) {

    for (long i = 0; i < nr_vert; i++) {
        std::cout << i << ": ";
        for (long j = 0; j < graph[i].size(); j++)
            std::cout << "(" << i << "," << graph[i][j].first << "," << graph[i][j].second << ") ";
        std::cout << "\n";
    }
}

// Make custom comparator
// (dst, cost) = (first, second)
struct comp {
    bool operator() (const std::pair<long, long>& left, const std::pair<long, long>& right) {
        return left.second > right.second;
    }
};


void dijkstra(long nr_vert, long src) {

    std::priority_queue<std::pair<long, long>, std::vector<std::pair<long, long>>, comp> q;

    // (vert, distance)
    std::pair<long, long> crt_vert;
    long already_marked = 0;

    for (long i = 1; i <= nr_vert; i++)
        dist[i] = INF;

    dist[src] = 0;

    q.push(std::make_pair(src, dist[src]));

    while (already_marked < nr_vert) {

        // Find first unprocessed
        while (!q.empty()) {
            crt_vert = q.top();
            q.pop();
            if (marked[crt_vert.first] == false)
                break;
        }

        marked[crt_vert.first] = true;
        already_marked++;

        // (vert, distance) = crt_vert
        // (dst, cost) = (first, second)
        for (long i = 0; i < graph[crt_vert.first].size(); i++)
            if (dist[graph[crt_vert.first][i].first] > (dist[crt_vert.first] + graph[crt_vert.first][i].second)) {
                dist[graph[crt_vert.first][i].first] = (dist[crt_vert.first] + graph[crt_vert.first][i].second);
                q.push(std::make_pair(graph[crt_vert.first][i].first, dist[graph[crt_vert.first][i].first]));
            }
        }
}




int main(void) {

    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);

    long nr_vert;
    long nr_edges;
    long src, dst, cost;

    std::cin >> nr_vert >> nr_edges;

    // Unoriented graph
    for (long i = 0; i < nr_edges; i++) {
        std::cin >> src >> dst >> cost;
        graph[src].push_back(std::make_pair(dst, cost));
    }


    dijkstra(nr_vert, 1);

    for (long i = 2; i <= nr_vert; i++)
        std::cout << dist[i] << " ";
    return 0;
}