Pagini recente » Cod sursa (job #1938841) | Cod sursa (job #1938750) | Cod sursa (job #2564838) | Cod sursa (job #2055371) | Cod sursa (job #2035602)
#include <fstream>
#include <vector>
#define INF 2000000000
#define DIM 50002
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
int n, m, x, y, c, viz[DIM], t[DIM], h[DIM], dim, dimm;
struct nodul
{
int nod, cost;
}aux;
struct dist
{
int val, h;
}d[DIM];
vector <nodul> graf[DIM];
void adauga(int nod)
{
h[++dimm] = nod;
dim = dimm;
while(d[h[dim]].val < d[h[dim / 2]].val && dim / 2 > 0)
{
swap(h[dim], h[dim / 2]);
dim /= 2;
}
d[nod].h = dim;
}
void scoate(int dim)
{
h[dim] = 0;
while(dim < dimm)
{
if(d[h[2 * dim]].val <= d[h[2 * dim + 1]].val && 2 * dim + 1 <= dimm)
{
swap(h[dim], h[2 * dim + 1]);
dim = 2 * dim + 1;
}
else
{
if(2 * dim == dimm || (d[h[2 * dim]].val < d[h[2 * dim + 1]].val && 2 * dim + 1 <= dimm))
{
swap(h[dim], h[2 * dim]);
dim *= 2;
}
}
}
-- dimm;
}
int main()
{
f>>n>>m;
for(int i = 1; i <= m; ++ i)
{
f>>x>>y>>c;
aux.nod = y;
aux.cost = c;
graf[x].push_back(aux);
aux.nod = x;
graf[y].push_back(aux);
}
for(int i = 2; i <= n; ++ i)
d[i].val = INF;
d[0].val = INF;
adauga(1);
for(int i = 1; i <= n; ++ i)
{
int nod = h[1];
scoate(nod);
for(int j = 0; j < graf[nod].size(); ++ j)
{
aux = graf[i][j];
if(viz[aux.nod] == 0)
{
if(d[nod].val + aux.cost < d[aux.nod].val)
{
d[aux.nod].val = d[nod].val + aux.cost;
}
adauga(aux.nod);
}
}
}
for(int i = 2; i <= n; ++ i)
{
if(d[i].val == INF)
g<<"0 ";
else
g<<d[i].val<<" ";
}
return 0;
}