Pagini recente » Cod sursa (job #2395388) | Cod sursa (job #1384120) | Cod sursa (job #937186) | Cod sursa (job #751661) | Cod sursa (job #1906695)
#include <fstream>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct nod
{
int val,cost;
nod *urm;
};
typedef nod *pnod;
#define nmax 50003
#define inf 2000000000
pnod v[nmax],p;
void ad(int x,int y,int c)
{
p=new nod;
p->val=y;
p->cost=c;
p->urm=v[x]->urm;
v[x]->urm=p;
}
int k,minim,n,m,father;
int dist[nmax],h[nmax],poz[nmax];
void upheap(int son)
{
while(son>1)
{
father=son>>1;
if(dist[h[father]]>dist[h[son]])
{
swap(h[father],h[son]);
swap(poz[h[father]],poz[h[son]]);
son=father;
}
else
son=1;
}
}
int son;
void downheap(int father)
{
son=1;
while(son)
{
son=0;
if(father*2<=k)
{
son=father*2;
if(father*2+1<=k)
if(dist[h[father*2+1]]<dist[h[father*2]])
son=father*2+1;
if(dist[h[father]]>dist[h[son]])
{
swap(poz[h[father]],poz[h[son]]);
swap(h[father],h[son]);
}
else
son=0;
}
}
}
int main()
{
int i,x,y,c;
f>>n>>m;
for(i=0;i<=n;i++)
{
v[i]=new nod;
v[i]->urm=0;
dist[i]=inf;
poz[i]=-1;
}
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
ad(x,y,c);
}
k=1;
h[1]=1;
poz[1]=1;
dist[1]=0;
while(k)
{
minim=h[1];
swap(h[1],h[k]);
poz[h[1]]=1;
k-=1;
downheap(1);
p=v[minim]->urm;
while(p)
{
if(dist[p->val]>dist[minim]+p->cost)
{
dist[p->val]=dist[minim]+p->cost;
if(poz[p->val]==-1)
{
k+=1;
h[k]=p->val;
poz[p->val]=k;
upheap(k);
}
else
upheap(poz[p->val]);
}
p=p->urm;
}
}
for(i=2;i<=n;i++)
{
if(dist[i]==inf)
g<<"0 ";
else
g<<dist[i]<<" ";
}
return 0;
}