Pagini recente » Monitorul de evaluare | Cod sursa (job #2842598) | Cod sursa (job #1536054) | Cod sursa (job #1693864) | Cod sursa (job #381806)
Cod sursa(job #381806)
using namespace std;
#include<iostream>
#include<fstream>
#define NN 50005
#define infi 1<<30
int v[NN],d[NN],t[NN],n;
int h[NN],nh;//un heap in care tinem minte elementele
int poz[NN];//pozitia in heap a nodului k
struct nod{int capat,cost;
nod* next;};
nod *g[NN];
void adaugacapat(int i,int j,int c)
{nod *t=new nod;
t->capat=j;
t->cost=c;
t->next=g[i];
g[i]=t;
}
void promoveaza(int k)
{
int esteh=0,aux,i;
while(!esteh&&k/2>0)
{
i=k/2;
if(d[h[i]]<=d[h[k]])
esteh=1;
else
{
aux=h[i];
h[i]=h[k];
h[k]=aux;
poz[h[i]]=i;
poz[h[k]]=k;
k=i;
}
}
}
void cerne(int k)
{
int esteh=0,aux,i;
while(2*k<=nh&&!esteh)
{
i=2*k;
if(i+1<nh&&d[h[i]]>d[h[i+1]])
i=i+1;
if(d[h[k]]<=d[h[i]])
esteh=1;
else
{
aux=h[i];
h[i]=h[k];
h[k]=aux;
poz[h[i]]=i;
poz[h[k]]=k;
k=i;
}
}
}
void dijsktra(int sursa)
{
for(int i=0;i<=n;i++)//de la 0
{
v[i]=0;
d[i]=infi;
t[i]=-1;
h[i]=i;
poz[i]=i;
}
nh=n;
//initializam sursa cu ce trebuie
v[sursa]=1;
d[sursa]=0;
t[sursa]=0;
h[sursa]=h[nh--];
poz[h[sursa]]=sursa;
for(nod *p=g[sursa] ; p ; p=p->next)
{
t[p->capat]=sursa;
d[p->capat]=p->cost;
promoveaza(poz[p->capat]);
}
//int gata=0;
for(int kkk=1;kkk<n;++kkk)
{
int pmin=0;
/*for(int i=1;i<=n;++i)
if(v[i]==0 && d[i]<d[pmin])
pmin=i;
*/
pmin=h[1];
if(d[pmin]==infi)break;
v[pmin]=1;
h[1]=h[nh--];
poz[h[1]]=1;
cerne(1);
for(nod* p=g[pmin];p;p=p->next)
if(v[p->capat]==0)
if(d[p->capat]>d[pmin]+p->cost)
{
d[p->capat]=d[pmin]+p->cost;
t[p->capat]=pmin;
promoveaza(p->capat);
}
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
g[i]=NULL;
int i,j,c;
for(;m;m--)
{
scanf("%d%d%d",&i,&j,&c);
adaugacapat(i,j,c);
}
dijsktra(1);
freopen("dijkstra.out","w",stdout);
for(int i=2;i<=n;i++)
if(d[i]!=infi)printf("%d ",d[i]);
else printf("%d ",0);
}