Cod sursa(job #1172639)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 17 aprilie 2014 19:43:37
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
//complexitate O(n*n)
#include<fstream>
using namespace std;
ifstream  fin("dijkstra.in");
ofstream fout("dijkstra.out");

int n,m,d[50003],i,x,y,j, infinit = (1<<30);
short int t[50003];
char viz[50003];

struct arc
{
    short int vecin,cost;
    arc *leg;
};

arc *vec[50003],*p;


int main()
{
    //citirea datelor
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>j;
        p=new arc;
        p->vecin=y;
        p->cost=j;
        p->leg=vec[x];
        vec[x]=p;
    }
    //algoritmul lui Dijkstra
    //partea 1 - initializarea
    for(i=1;i<=n;i++)
    {
        d[i]=infinit;
        viz[i]=0;
        t[i]=0;//nici un varf nu are tata
    }
    d[1]=0;//pornim din varful 1
    //partea 2 - algoritmul propriu-zis
    for (i=1;i<=n;i++)
    {
        x=infinit;
        for(j=1;j<=n;j++)
        {
            if(viz[j]==0 && d[j]<x)
            {
                x=d[j];
                y=j;
            }
        }
        if(x==infinit)break;//s-a consumat componenta conexa
        viz[y]=1;//a fost ales y, cel cu d[y] minim
        for(p=vec[y];p;p=p->leg)
        {
            if(d[y]+p->cost < d[p->vecin])
            {
                d[p->vecin]=d[y]+p->cost;
                t[p->vecin]=y;//s-a modificat tatal lui p->vecin
            }
        }
    }
    //partea 3 - afisarea
    for (i=2;i<=n;i++)
    {
        if(d[i]==infinit)d[i]=0;
        fout<<d[i]<<" ";
    }
    fout.close();
    fin.close();
    return 0;
}