Cod sursa(job #2315872)

Utilizator rexlcdTenea Mihai rexlcd Data 10 ianuarie 2019 18:48:23
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

typedef pair < int , int > pii;

const int INF = 0x3f3f3f3f;
const int N_MAX = 50002;

priority_queue < pii , vector < pii > , greater < pii > > s;
vector < pii > v[N_MAX];
bitset < N_MAX > mark;

int d[N_MAX];

int main()
{
    ifstream f("dijkstra.in");
    ofstream g("dijkstra.out");
    int n, m; f >> n >> m; f.ignore();
    for(int i = 1; i <= m; i++)
    {
        int j = 0, x = 0, y = 0, c = 0;
        char s[22]; f.getline(s, 20);
        while(isdigit(s[j]))
            x = x * 10 + (s[j++] - '0');
        j++;
        while(isdigit(s[j]))
            y = y * 10 + (s[j++] - '0');
        j++;
        while(isdigit(s[j]))
            c = c * 10 + (s[j++] - '0');
        v[x].push_back({y, c});
    }

    memset(d, INF, sizeof(d));
    d[1] = 0;
    for(int i = 1; i <= n; i++)
        s.push({d[i], i});

    while(!s.empty())
    {
        int x = s.top().second;
        s.pop();
        mark[x] = 0;

        for(int i = 0; i < v[x].size(); i++)
        {
            int y = v[x][i].first, c = v[x][i].second;

            if(d[x] + c < d[y])
            {
                d[y] = d[x] + c;
                if(!mark[y])
                {
                    s.push({d[y], y});
                    mark[y] = 1;
                }
            }
        }
    }

    for(int i = 2; i <= n; i++)
    {
        if(d[i] == INF)
            d[i] = 0;
        g << d[i] << " ";
    }
    g << '\n';
    f.close();
    g.close();
    return 0;
}