Cod sursa(job #2285467)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 18 noiembrie 2018 16:57:10
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#include <vector>
#include <queue>

#define INF 0x3f3f3f3f

using namespace std;

void read(int &n, int &m, vector<vector<pair<int, int> > > &graph) {
    int source, target, cost;

    scanf("%d %d", &n, &m);

    for (int i = 0; i < n; i++) {
        graph.push_back(vector<pair<int, int> >());
    }

    for (int i = 0; i < m; i++) {
        scanf("%d %d %d", &source, &target, &cost);

        graph[source - 1].push_back(make_pair(cost, target - 1));
    }
}

vector<int> dijkstra(vector<vector<pair<int, int> > > graph, int start_node) {
    vector<int> cost(graph.size(), INF);
    priority_queue<pair<int, int> > fringe;
    int current_node;

    fringe.push(make_pair(0, start_node));
    cost[start_node] = 0;

    while (!fringe.empty()) {
        current_node = fringe.top().second;
        fringe.pop();

        for (vector<pair<int, int> >::iterator it = graph[current_node].begin(); it != graph[current_node].end(); it++) {
            if (cost[it->second] > cost[current_node] + it->first) {
                cost[it->second] = cost[current_node] + it->first;
                fringe.push(make_pair(-cost[it->second], it->second));
            }
        }
    }

    return cost;
}


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

    int n, m;
    vector<vector<pair<int, int> > > graph;
    vector<int> answer;

    read(n, m, graph);
    answer = dijkstra(graph, 0);

    for (vector<int>::iterator it = answer.begin(); it != answer.end(); it++) {
        if (!*it) {
            continue;
        } else if (*it == INF) {
            printf("0 ");
        } else {
            printf("%d ", *it);
        }
    }
}