Pagini recente » Cod sursa (job #336379) | Cod sursa (job #906884) | Cod sursa (job #2955787) | Cod sursa (job #2538985) | Cod sursa (job #1516945)
#include<fstream>
#include<vector>
#include<limits.h>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
const int NMax = 50001;
const int INF = INT_MAX;
int n, m, nh;
int d[NMax];
int h[NMax];
int poz[NMax];
struct muchie{ int y,cost; };
vector <muchie> a[NMax];
void citire()
{
in >> n >> m;
for(int i=1; i<=m; i++)
{
int x,y,cost;
in>>x>>y>>cost;
a[x].push_back(muchie{y, cost});
}
}
void schimba(int i1, int i2)
{
int aux = h[i1];
h[i1] = h[i2];
h[i2] = aux;
poz[h[i1]] = i1;
poz[h[i2]] = i2;
}
void urca(int i)
{
while( i>1 && d[h[i]] < d[h[i/2]])
{
schimba(i, i/2);
i/=2;
}
}
void coboara(int i)
{
int bun=i, fs=i*2, fd=i*2+1;
if(fs<=nh && d[h[fs]] < d[h[bun]])
bun=fs;
if(fd<=nh && d[h[fd]] < d[h[bun]])
bun=fd;
if(i!=bun)
{
schimba(i, bun);
coboara(bun);
}
}
void adauga(int x)
{
h[++nh]=x;
poz[x]=nh;
urca(nh);
}
void sterge(int i)
{
schimba(i, nh);
nh--;
coboara(i);
urca(i);
}
void init(int x)
{
nh=0;
for(int i=1; i<=n; i++){
d[i]=INF;
}
d[x]=0;
adauga(x);
}
int dijkstra(int x)
{
init(x);
while(nh!=0)
{
x = h[1];
sterge(1);
for(size_t i=0; i<a[x].size(); i++)
{
int y=a[x][i].y;
int cost=a[x][i].cost;
if(d[x] + cost < d[y])
{
d[y] = d[x]+cost;
if(poz[y] == 0)
adauga(y);
else
urca(poz[y]);
}
}
}
}
void afisare()
{
for(int i=2; i<=n; i++)
if(d[i] == INF)
out << 0 << ' ';
else
out << d[i] << ' ';
out << '\n';
}
int main ()
{
citire();
//nodul initial
dijkstra(1);
afisare();
return 0;
}