Pagini recente » Cod sursa (job #70307) | Cod sursa (job #2194031) | Cod sursa (job #1247763) | Cod sursa (job #1928951) | Cod sursa (job #2095276)
#include <iostream>
#include <fstream>
#define Mmax 250000
#define Nmax 50000
#define inf 20000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n,m,N=0,a,viz[Nmax+5],sol[Nmax];
struct node
{
int info,x;
node *urm;
}*v[Nmax+5],*c,*d;
int maxv(int x,int y)
{
return x>y?x:y;
}
struct heap
{
int info,x;
}H[Nmax+5];
inline int tata(int k)
{
return k/2;
}
inline int son1(int k)
{
return k*2;
}
inline int son2(int k)
{
return k*2+1;
}
void jos(int k,int h)
{
int son;
heap aux;
do
{
son=0;
if(son1(k)<=h)
{if(H[son1(k)].info<H[k].info)
son=son1(k);
if(son2(k)<=h)
{if(H[son].info>H[son2(k)].info && H[son2(k)].info<H[k].info)
son=son2(k);}
if(son)
{
aux=H[k];
H[k]=H[son];
H[son]=aux;
k=son;
}
}
}while(k>=1 && k<h && son);
}
void sus(int k)
{
heap aux=H[k];
while(k>1 && k<=N && H[k].info<H[tata(k)].info)
{
H[k]=H[tata(k)];
k=tata(k);
H[k]=aux;
aux=H[k];
}
}
void heapify()
{
for(int i=N/2;i>0;i--)
jos(i,N);
}
void sterge(int k)
{
H[k]=H[N];
N--;
if(k>1 && H[k].info<H[tata(k)].info)
sus(k);
else
jos(k,N);
}
void baga(int k,int l)
{
H[++N].info=l;
H[N].x=k;
sus(N);
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
v[i]=new node;
v[i]->info=i;
v[i]->urm=0;
sol[i]=inf;
}
int x1,y1,z1,a=1,b;
while(fin>>x1>>y1>>z1)
{
c=v[x1];
while(c->urm)
c=c->urm;
d=new node;
d->info=z1;
d->x=y1;
d->urm=0;
c->urm=d;
c=v[y1];
while(c->urm)
c=c->urm;
d=new node;
d->info=z1;
d->x=x1;
d->urm=0;
c->urm=d;
}
H[++N].info=0;
H[N].x=a;
while(N)
{
c=v[a];
b=H[1].info;
H[1].info=0;
while(c->urm)
{
c=c->urm;if(!viz[c->x] && sol[c->x]>c->info+b){baga(c->x,c->info+b);viz[c->x]=1;sol[c->x]=c->info+b;}
}
sterge(1);
a=H[1].x;
}
for(int i=2;i<n;i++)
fout<<sol[i]<<" ";
fout<<sol[n];
return 0;
}