Cod sursa(job #1480714)

Utilizator o_micBianca Costin o_mic Data 3 septembrie 2015 05:16:46
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#define MAX 100005
#define INFINITY (1 << 30)
using namespace std;

vector <int> gr[MAX];
map<pair<int, int>, int> cst;
int dmin[MAX];
int viz[MAX], in_queue[MAX];

class mycomparison
{
public:
  bool operator() (const pair<int, int>& lhs, const pair<int, int>& rhs) const
  {
    return (lhs.second>rhs.second);
  }
};

void dijkstra(int v[MAX], int n, int start) {
    priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> q;
    for(int i = 1; i <= n; ++i){
        v[i] = INFINITY;
        viz[i] = in_queue[i] = 0;
    }
    v[start] = 0;
    q.push(make_pair(start, 0));
    viz[start] = in_queue[start] = 1;
    while(!q.empty()) {
        int node = q.top().first;
        viz[node] = 1;
        q.pop();
        for(int i = 0; i < gr[node].size(); ++i){
            if(!viz[gr[node][i]]){
                int x = v[node] + cst[make_pair(node, gr[node][i])];
                if(x < v[gr[node][i]]) {
                    v[gr[node][i]] = x;
                    if(!in_queue[gr[node][i]]){
                        q.push(make_pair(gr[node][i], x));
                        in_queue[gr[node][i]] = 1;
                    }
                }
            }
        }
    }
}

int main() {
    int n, m, a, b, c, minn, res = 0;
    cin >> n >> m;
    for(int i = 0; i < m; ++i) {
        cin >> a >> b >> c;
        gr[a].push_back(b);
        gr[b].push_back(a);
        if(cst.find(make_pair(a, b)) != cst.end())
            cst[make_pair(a, b)] = cst[make_pair(b, a)] = min(c, cst[make_pair(a, b)]);
        else
            cst[make_pair(a, b)] = cst[make_pair(b, a)] = c;
    }
    dijkstra(dmin, n, 1);
    for(int i = 2; i <= n; ++i)
        cout << dmin[i] << " ";
    return 0;
}