Pagini recente » Cod sursa (job #643667) | Cod sursa (job #2032539) | Cod sursa (job #3163287) | Cod sursa (job #2806191) | Cod sursa (job #1205289)
#include <fstream>
#include <iostream>
using namespace std;
struct nod
{
int urm,cost;
nod *adr;
};
typedef nod *lda1;
lda1 lda[50005];
struct cel
{
int val,nod;
} heap [250005];
int n,m,x,y,z,mheap,minim[50005];
void adauga(int val,int nod)
{
++mheap; heap[mheap].val=val; heap[mheap].nod=nod;
int v=mheap;
while (v>1 && heap[v/2].val>val)
{
cel a=heap[v/2]; heap[v/2]=heap[v]; heap[v]=a; v=v/2;
}
}
void scoate()
{
heap[1]=heap[mheap];
--mheap;
int advr=1,mini=1,i=1;
while (advr==1)
{
if (i*2<=mheap && heap[mini].val>heap[i*2].val) mini=i*2;
if (i*2+1<=mheap && heap[mini].val>heap[i*2+1].val) mini=i*2+1;
if (mini!=i) { cel p=heap[mini]; heap[mini]=heap[i]; heap[i]=p; i=mini; } else advr=0;
}
}
int main()
{
ifstream in ("dijkstra.in");
ofstream out ("dijkstra.out");
in>>n>>m;
for (int i=1;i<=m;++i)
{
in>>x>>y>>z;
lda1 p=new nod;
p->urm=y;
p->cost=z;
p->adr=lda[x];
lda[x]=p;
}
for (lda1 p=lda[1];p!=0;p=p->adr)
{
adauga(p->cost,p->urm);
}
for (int i=1;i<=n;++i) minim[i]=-1;
while (mheap>0)
{
if (minim[heap[1].nod]==-1)
{
minim[heap[1].nod]=heap[1].val;
int v=heap[1].nod,val=heap[1].val;
scoate();
for (lda1 p=lda[v];p!=0;p=p->adr)
{
adauga(val+p->cost,p->urm);
}
} else scoate();
}
for (int i=2;i<=n;++i) if (minim[i]!=-1) out<<minim[i]<<" ";else out<<"0 ";
in.close();
out.close();
return 0;
}