Cod sursa(job #2095276)

Utilizator dacianouaPapadia Mortala dacianoua Data 27 decembrie 2017 12:31:36
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <iostream>
#include <fstream>
#define Mmax 250000
#define Nmax 50000
#define inf 20000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m,N=0,a,viz[Nmax+5],sol[Nmax];
struct node
{
    int info,x;
    node *urm;
}*v[Nmax+5],*c,*d;
int maxv(int x,int y)
{
    return x>y?x:y;
}
struct heap
{
    int info,x;
}H[Nmax+5];
inline int tata(int k)
{
    return k/2;
}
inline int son1(int k)
{
    return k*2;
}
inline int son2(int k)
{
    return k*2+1;
}
void jos(int k,int h)
{
    int son;
    heap aux;
    do
    {
        son=0;
        if(son1(k)<=h)
       {if(H[son1(k)].info<H[k].info)
        son=son1(k);
        if(son2(k)<=h)
        {if(H[son].info>H[son2(k)].info && H[son2(k)].info<H[k].info)
            son=son2(k);}
       if(son)
        {
            aux=H[k];
            H[k]=H[son];
            H[son]=aux;
            k=son;
        }
       }
    }while(k>=1 && k<h && son);
}
void sus(int k)
{
    heap aux=H[k];
    while(k>1 && k<=N && H[k].info<H[tata(k)].info)
    {
        H[k]=H[tata(k)];
        k=tata(k);
        H[k]=aux;
        aux=H[k];
    }
}
void heapify()
{
    for(int i=N/2;i>0;i--)
        jos(i,N);
}
void sterge(int k)
{
    H[k]=H[N];
    N--;
    if(k>1 && H[k].info<H[tata(k)].info)
        sus(k);
    else
        jos(k,N);
}
void baga(int k,int l)
{
    H[++N].info=l;
    H[N].x=k;
    sus(N);
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        v[i]=new node;
        v[i]->info=i;
        v[i]->urm=0;
        sol[i]=inf;
    }
    int x1,y1,z1,a=1,b;
    while(fin>>x1>>y1>>z1)
    {
        c=v[x1];
        while(c->urm)
            c=c->urm;
        d=new node;
        d->info=z1;
        d->x=y1;
        d->urm=0;
        c->urm=d;
        c=v[y1];
        while(c->urm)
            c=c->urm;
        d=new node;
        d->info=z1;
        d->x=x1;
        d->urm=0;
        c->urm=d;
    }
    H[++N].info=0;
    H[N].x=a;
    while(N)
    {
        c=v[a];
        b=H[1].info;
        H[1].info=0;
        while(c->urm)
        {
            c=c->urm;if(!viz[c->x] && sol[c->x]>c->info+b){baga(c->x,c->info+b);viz[c->x]=1;sol[c->x]=c->info+b;}
        }
        sterge(1);
        a=H[1].x;
    }
    for(int i=2;i<n;i++)
        fout<<sol[i]<<" ";
    fout<<sol[n];
    return 0;
}