Cod sursa(job #1867371)

Utilizator msciSergiu Marin msci Data 4 februarie 2017 00:08:52
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <tuple>
#include <limits>
#include <functional>
#include <complex>
#include <bitset>
#include <list>

//#include <atomic>
//#include <condition_variable>
//#include <future>
//#include <mutex>
//#include <thread>

using namespace std;

#define debug(x) cerr << #x << " = " << x << "\n"

const int INF           = 0x3f3f3f3f;
const long long INFL    = 0x3f3f3f3f3f3f3f3fLL;

const int N = 50005;

typedef int Weight;
typedef int Index;

vector< pair<Weight, Index> > g[N];
vector<Weight> dist(N);
vector<bool> visited(N);

void dijkstra(int s)
{
    fill(dist.begin(), dist.end(), INF);

    priority_queue< pair<Weight, Index>, vector< pair<Weight, Index> >, std::greater< pair<Weight, Index> > > q;
    dist[s] = 0;
    q.push({0, s});
    
    while (!q.empty())
    {
        Index u = q.top().second;
        q.pop();
        if (visited[u]) continue;
        visited[u] = true;
        for (Index ei = 0; ei < (Index) g[u].size(); ei++)
        {
            const pair<Weight, Index>& e = g[u][ei];
            Index v = e.second;
            Weight d = dist[u] + e.first;
            if (d < dist[v])
            {
                dist[v] = d;
                q.push({d, v});
            }
        }
    }
}

int main(int argc, char* argv[]) 
{
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    cin.sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int x, y, w;
        cin >> x >> y >> w;
        x--, y--;
        g[x].push_back({w, y});
    }
    dijkstra(0);
    for (int i = 1; i < n; i++) cout << (dist[i] == INF ? 0 : dist[i])<< " ";
    cout << "\n";
    return 0;
}