Cod sursa(job #2967643)

Utilizator stefan05Vasilache Stefan stefan05 Data 19 ianuarie 2023 21:54:23
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>

#define NMAX 1005
#define INF 10000005

using namespace std;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

struct Arc
{
    int vf, c;
};

int n, m, x0;
int x, y, c;
vector<Arc> cost[NMAX];
int dmin[NMAX], pre[NMAX];
int minim, vfmin;
int vfcrt, costcrt;
int i, j;

class compare
{
public:
    bool operator () (const int& x, const int& y)
    {
        return dmin[x] > dmin[y];
    }
};

priority_queue<int, vector<int>, compare> h;

void afisare(int);

int main()
{
    ///CITIRE
    fin >>n>>m; x0 = 1;
    for (i = 1; i <= m; ++i)
    {
        fin >>x>>y>>c;
        cost[x].push_back({y, c});
    }

    ///ALG. LUI DIJKSTRA
    for (i = 1; i <= n; ++i)
        dmin[i] = INF, pre[i] = x0;
    pre[x0] = 0; dmin[x0] = 0;

    h.push(x0);
    while (!h.empty())
    {
        vfmin = h.top(); h.pop();
        minim = dmin[vfmin];
        for (i = 0; i < cost[vfmin].size(); ++i)
        {
            vfcrt = cost[vfmin][i].vf;
            costcrt = cost[vfmin][i].c;
            if (dmin[vfcrt] > minim + costcrt)
            {
                dmin[vfcrt] = minim + costcrt;
                pre[vfcrt] = vfmin;
                h.push(vfcrt);
            }
        }
    }

    //AFISARE
    for (i = 2; i <= n; ++i)
        if (dmin[i] == INF) fout <<0<<' ';
        else fout <<dmin[i]<<' ';
    fout <<'\n';

    //afisare(1);
    fout.close();
    return 0;
}

void afisare(int vf)
{
    if (vf == x0)
    {
        fout <<x0<<' ';
        return;
    }

    afisare(pre[vf]);
    fout <<vf<<' ';
}