Cod sursa(job #1500160)

Utilizator Julian.FMI Caluian Iulian Julian. Data 11 octombrie 2015 16:14:05
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <queue>
#define inf 0x7FFF
#define nmax 50005
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

struct element
{long x,c;};
element *a[nmax];
long d[nmax],m[nmax],h[nmax],nr=0;



void push(long x)
{long tata,fiu;
    h[++nr]=x; fiu=nr; tata=nr/2;
while(tata>0)
    if(d[h[tata]]>d[x])
       {h[fiu]=h[tata];
       fiu=tata;
       tata/=2;
       }else break;
h[fiu]=x;
}

long top()
{long x,tata,fiu,v=h[1];
h[1]=h[nr];nr--;
x=h[1];
tata=1;fiu=2*tata;

while(fiu<=nr)
{if(fiu<nr && d[h[fiu+1]]<d[h[fiu]])fiu++;
 if(d[x]>d[h[fiu]])
 {h[tata]=h[fiu];
  tata=fiu;
  fiu*=2;
  }
 else break;
}
h[tata]=x;
return v;}

long hempty()
{
    return nr==0;
}


int main()
{long x,y,c,n,nri,i,j,vf,dmin;
    fin>>n>>nri;

for(x=1;x<=n;x++)
    {a[x]=(element*)realloc(a[x],sizeof(element));
    a[x][0].x=0;}

    for(i=1;i<=nri;i++)
    {   fin>>x>>y>>c;
        a[x][0].x++;
        a[x]=(element*)realloc(a[x],(a[x][0].x+1)*sizeof(element));
        a[x][a[x][0].x].x=y;  a[x][a[x][0].x].c=c;
        a[y][0].x++;
        a[y]=(element*)realloc(a[y],(a[y][0].x+1)*sizeof(element));
        a[y][a[y][0].x].x=x;  a[y][a[y][0].x].c=c;
    }


for(i=1;i<=n;i++)d[i]=inf;
    d[1]=0;
push(1);

while(!hempty())
{
vf=top();
for(i=1;i<=a[vf][0].x;i++)
  if(d[a[vf][i].x]> d[vf]+a[vf][i].c)
  {d[a[vf][i].x]= d[vf]+a[vf][i].c;
      push(a[vf][i].x);
  }

}

    for(i=2;i<=n;i++)
        if(d[i]!=inf)fout<<d[i]<<' ';
        else fout<<0<<' ';
}