Cod sursa(job #1659562)

Utilizator malina_floreaMalina Florea malina_florea Data 22 martie 2016 12:38:48
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <vector>
#include <queue>
#define DMAX 50010
using namespace std;
FILE * fin = fopen ("dijkstra.in", "r");
FILE * fout = fopen ("dijkstra.out", "w");

struct element
{
    int nod, cost;
};

struct element1
{
    int nod, cost, prec;
    friend bool operator < (element1 a, element1 b)
    {
        return a.cost>b.cost;
    };
};

void citire();
void apm();
void afisare();

int n, m;
vector <element> lista[DMAX];
priority_queue <element1> cmin;

int use[DMAX], prec[DMAX];
int cost[DMAX];

int main()
{
    citire();
    apm();
    afisare();
    
    fclose(fin);
    fclose(fout);
    return 0;
}

void citire()
{
    
    int i, a, b;
    element aux;
    
    fscanf(fin, "%d %d", &n,&m);
    for (i=1; i<=m; i++)
    {
        fscanf(fin, "%d %d %d", &a, &b, &aux.cost);
        
        aux.nod=b;
        lista[a].push_back(aux);
        
        aux.nod=a;
        lista[b].push_back(aux);
    }
}

void apm()
{
    int i, j;
    element1 minim, elem;
    
    use[1]=1;
    prec[1]=0;
    
    for (i=0; i<lista[1].size(); i++)
    {
        elem.nod = lista[1][i].nod;
        elem.cost = lista[1][i].cost;
        elem.prec = 1;
        cmin.push(elem);
    }
    
    for (i=1; i<n; i++)
    {
        do
        {
            minim=cmin.top();
            cmin.pop();
        }
        while (use[minim.nod]);
        
        use[minim.nod]=1;
        cost[minim.nod]=cost[minim.prec]+minim.cost;
        prec[minim.nod]=minim.prec;
        
        for (j=0; j<lista[minim.nod].size(); j++)
            if (!use[lista[minim.nod][j].nod])
            {
                elem.nod = lista[minim.nod][j].nod;
                elem.cost = lista[minim.nod][j].cost;
                elem.prec = minim.nod;
                cmin.push(elem);
            }
    }
}

void afisare()
{
    int i;
    for (i=2; i<=n; i++)
        fprintf(fout, "%d ", cost[i]);
}