Cod sursa(job #1849278)

Utilizator SkiryFarauanu Ionut Skiry Data 17 ianuarie 2017 11:13:07
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>

using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct nod{
    int nr,val;
nod *urm;};
nod *a[50001],*p,*q;
int n,m,i,j,x,y,z,v,nr,vf,d[50001],viz[50001];
void pune(int x,int y,int z)
{
    p=new nod;
    p->nr=y;
    p->val=z;
    p->urm=0;
    if(!a[x])
        a[x]=p;
    else
    {
        q=a[x];
        while(q->urm)
            q=q->urm;
        q->urm=p;
    }
}
void cautaMin(int &vf)
{
        int m=99999;
        /**p=a[v];
        while(p)
        {
            if(a[p->nr]->viz==0&&p->val<m) ///daca nu e luat si are val minima
                m=p->val,vf=p->nr; ///retin val minima si varful in care se afla
            p=p->urm;
        }*/
        for(int i=1;i<=n;i++)
            if(d[i]<m&&!viz[i])
                m=d[i],vf=i;

}
void imbunatatireDrum(int vf)
{
    p=a[vf];
    while(p)
    {
        if(!viz[p->nr]&&d[vf]+p->val<d[p->nr])
                d[p->nr]=d[vf]+p->val;
        p=p->urm;
    }
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        pune(x,y,z);
    }
    v=1;
    viz[1]=1;

    /*p=new nod;
    p->nr=0;
    p->val=0;
    p->urm=0;
    for(i=2;i<=n;i++)
        if(!a[i])
            a[i]=p;*/
    p=a[v];
    while(p)
    {
        d[p->nr]=p->val;
        p=p->urm;
    }
    for(i=2;i<=n;i++)
        if(!d[i]) d[i]=99999;

    for(i=1;i<n;i++)
        {
            cautaMin(vf);
            imbunatatireDrum(vf);
            viz[vf]=1;
        }

    for(i=2;i<=n;i++)
    if(d[i]==99999) g<<"0 ";
    else g<<d[i]<<" ";

        return 0;
}