Cod sursa(job #1465786)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 27 iulie 2015 23:27:30
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
/*
 * =====================================================================================
 *
 *       Filename:  IA_dijkstra.cpp
 *
 *    Description: http://www.infoarena.ro/problema/dijkstra
                   Graful este orientat.
 *
 *        Version:  1.0
 *        Created:  06/21/2015 13:13:34
 *       Revision:  none
 *       Compiler:  gcc/g++
 *
 *         Author:  Marius-Constantin Melemciuc
 *          email:
 *   Organization:
 *
 * =====================================================================================
 */
  
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <queue>
#include <climits>
  
using namespace std;
  
vector<vector<pair<int, int> > > graph;
  
class Cmp {
public:
    bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
        return (a.second > b.second)? true: false;
    }
};

// O(MlogN)
vector<int> dijkstra(int source, int n, int m) {
    vector<int> distance(n, INT_MAX);
    vector<bool> visited(n, false);
    priority_queue<pair<int, int>,
                   vector<pair<int, int> >,
                   Cmp> pq;
  
    distance[source] = 0;
    pq.push(make_pair(source, distance[source]));
  
    while (!pq.empty()) {
        int x  = pq.top().first;
         
        pq.pop();
         
        if (visited[x])
            continue;
        visited[x] = true;
          
        for (auto it = graph[x].begin(); it != graph[x].end(); it++) {
            int y    = it->first;
            int cost = it->second;
  
            if (distance[y] > distance[x] + cost) {
  
                distance[y] = distance[x] + cost;
                pq.push(make_pair(y, distance[y]));
            } /* if */
        } /* for */
    } /* while */
  
    return distance;
}
  
int main() {
    int n, m;
      
    ifstream input("dijkstra.in");
    ofstream output("dijkstra.out");
  
    input >> n >> m;
      
    graph.resize(n); 

    int x, y, cost;  
    for (int i = 0; i < m; i++) {
        input >> x >> y >> cost;
        x--;
        y--;
        graph[x].push_back(make_pair(y, cost)); // oriented graph
    }
  
    vector<int> distance = dijkstra(0, n, m);
  
    for (int i = 1; i < n; i++) {
        output << (distance[i] == INT_MAX? 0: distance[i]) << ' ';
    }
    output << '\n';
     
    input.close();
    output.close();
  
    return 0;
}