Cod sursa(job #1878738)

Utilizator sotoc1999Sotoc George sotoc1999 Data 14 februarie 2017 14:00:05
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
//GRAF ORIENTAT PONDERAT
#include <iostream>
#include <fstream>
#define INF 25004
#define NMAX 50004
#define MMAX 250004
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

int n; //nr noduri
int m; //nr muchii
struct graf{ //structura listei de adiacenta (alocare dinamica)
    int nod;
    int cost;
    struct graf *urm;
}*L[NMAX],*p;

int d[NMAX]; //distanta de la sursa la fiecare nod
int viz[NMAX]; //noduri vizitate (epuizate/explorate complet)

void citire()
{
    int a,b,c;
    in>>n>>m;
    for(int i=1;i<=m;++i)
    {
        in>>a>>b>>c;
        //muchie a->b de cost c
        p=new graf;
        p->nod=b;
        p->cost=c;
        p->urm=L[a];
        L[a]=p;
    }
}

void afisD()
{
    for(int i=2;i<=n;++i)
    {
        if(d[i]==INF)
            out<<"0 ";
        else
            out<<d[i]<<" ";
    }
    out<<"\n";
}

void dijkstra(int source)
{
//initializeaza distantele cu INF
    for(int i=1;i<=n;++i)
        d[i]=INF;
    d[source]=0; //distanta sursa->sursa = 0

//repeta de n ori (pana cand epuizam nodurile)
    bool ok=true;
    while(ok==true)
    {
        ok=false;

        //extrage nodul nevizitat de distanta minima
        int mn=INF,act;

        for(int i=1;i<=n;++i)
            if(viz[i]==false && mn>d[i])
                mn=d[i], act=i, ok=true;

        viz[act]=true;

        //exploreaza vecinii nodului extras SI actualizeaza distanta sursa->actual->vecin
        for(graf *p=L[act];p!=NULL;p=p->urm)
        {
            int vecin=p->nod;
            int cost=p->cost;

            if(d[vecin] > d[act]+cost)
                d[vecin] = d[act]+cost;
        }
    }
}

int main()
{
    citire();

    int source=1;
    dijkstra(source);

    afisD();

    return 0;
}