Cod sursa(job #2669069)

Utilizator grigorut_octavianGrigorut Dominic Octavian grigorut_octavian Data 5 noiembrie 2020 23:33:10
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb

#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define inf 2147483647
#define mx 50001

using namespace std;

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

struct nod
{
    int val, cost;
    nod *next;
};

int d[mx],n,m;
nod *l[mx];
bool fr[mx];

struct com
{
    bool operator()(int x, int y)
    {
        return d[x]>d[y];
    }
};

priority_queue<int,vector<int>,com> q;

void adauga(int i,int j, int cos)
{
    nod *a=new nod;
    a->val=j;
    a->cost=cos;
    a->next=l[i];
    l[i]=a;
}

void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int a,b,cos;
        fin>>a>>b>>cos;
        adauga(a,b,cos);
    }
}

void dijkstra(int start)
{
    for(int i=1;i<=n;i++)
        d[i]=inf;
    d[start]=0;
    q.push(start);
    fr[start]=true;
    int curent, vecin, cos;
    while(!q.empty())
    {
        curent=q.top();
        q.pop();
        fr[curent]=false;
        for(nod *p=l[curent];p!=NULL;p=p->next)
        {
            vecin=p->val;
            cos=p->cost;
            if(d[curent]+cos<d[vecin])
            {
                d[vecin]=d[curent]+cos;
                if(fr[vecin]==false)
                {
                    q.push(vecin);
                    fr[vecin]=true;
                }
            }
        }
    }
}

void afis()
{
    for(int i=2;i<=n;i++)
    {
        if(d[i]==inf)
            fout<<0<<' ';
        else fout<<d[i]<<' ';
    }
}

int main()
{
    citire();
    dijkstra(1);
    afis();
    return 0;
}