Pagini recente » Cod sursa (job #1727960) | Cod sursa (job #2117120) | Cod sursa (job #2167530) | Cod sursa (job #877016) | Cod sursa (job #2139555)
#include<fstream>
using namespace std;
int n,m,i,x,y,c,d[50002],H[50002],p[50002],nd;
struct nod
{
int x,c;
nod *urm;
};
nod *gr[50002],*grt[50002];
int inf=2000000000;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
void adaug(int x,int y,int c)
{
nod *p=new nod;
p->x=y;
p->c=c;
p->urm=gr[x];
gr[x]=p;
}
void down(int k)
{
int tata=k,fiu=2*k;
while(fiu<=m)
{
if(fiu+1<=m && d[H[fiu]]>d[H[fiu+1]]) fiu++;
if(d[H[tata]]>d[H[fiu]])
{
swap(H[tata],H[fiu]);
swap(p[tata],p[fiu]);
tata=fiu;
fiu=2*tata;
}
else fiu=m+1;
}
}
void up(int k)
{
int fiu=k,tata=k/2;
while(tata>=1 && d[H[tata]]>d[H[fiu]])
{
swap(H[tata],H[fiu]);
swap(p[tata],p[fiu]);
fiu=tata;
tata=tata/2;
}
}
int main()
{
f>>n>>m;
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
adaug(x,y,c);
adaug(y,x,c);
}
for(i=1;i<=n;i++)
{
d[i]=inf;
H[i]=i;
p[i]=i;
}
d[1]=0;
m=n;
for(i=1;i<n;i++)
{
nd=H[1];
swap(H[1],H[m]);
swap(p[1],p[m]);
m--;
down(1);
for(nod *q=gr[nd];q!=NULL;q=q->urm)
{
if(d[q->x]>d[nd]+q->c)
{
d[q->x]=d[nd]+q->c;
up(p[q->x]);
}
}
}
for(i=2;i<=n;i++)
if(d[i]!=inf) g<<d[i]<<" ";
else g<<0<<" ";
f.close();
g.close();
return 0;
}