Pagini recente » Cod sursa (job #284115) | Cod sursa (job #639465) | Cod sursa (job #2073989) | Cod sursa (job #2999376) | Cod sursa (job #475900)
Cod sursa(job #475900)
#include <fstream>
#include <vector>
#define nmax 50005
using namespace std;
int N, M;
vector<int> Neig[nmax], Cost[nmax];
void read()
{
int x, y, c;
ifstream fin("dijkstra.in");
fin >> N >> M;
while (M--)
{
fin >> x >> y >> c;
Neig[x].push_back(y);
Cost[x].push_back(c);
}
fin.close();
}
void push(int k, int Heap[], int Dist[], int Wher[])
{
int i;
Heap[++Heap[0]] = k;
for (i = Heap[0]; i > 1 && Dist[Heap[i >> 1]] > Dist[k]; i >>= 1)
{
Wher[Heap[i] = Heap[i >> 1]] = i;
}
Wher[Heap[i] = k] = i;
}
bool empty(int Heap[])
{
return Heap[0] == 0;
}
int pop(int Heap[], int Dist[], int Wher[])
{
int k = Heap[1], i = 1, j = Heap[1] = Heap[Heap[0]--], m, p;
while (Heap[0] >= (i << 1))
{
m = Dist[Heap[i << 1]];
p = i << 1;
if (Heap[0] >= (i << 1 | 1) && Dist[Heap[i << 1 | 1]] < m)
{
m = Dist[Heap[i << 1 | 1]];
++p;
}
if (m < Dist[j])
{
Wher[Heap[i] = Heap[p]] = i;
i = p;
}
else
{
break;
}
}
Wher[Heap[i] = j] = i;
return k;
}
void update(int k, int Heap[], int Dist[], int Wher[])
{
int i;
for (i = Wher[k]; i > 1 && Dist[Heap[i >> 1]] > Dist[k]; i >>= 1)
{
Wher[Heap[i] = Heap[i >> 1]] = i;
}
Wher[Heap[i] = k] = i;
}
void solve(int Dist[])
{
int i, u, d;
int f = numeric_limits<int>::max();
int Heap[nmax], Wher[nmax];
bool Visi[nmax];
for (i = 2, Heap[1] = Wher[1] = 1, Dist[1] = 0, Visi[1] = false, Heap[0] = N; i <= N; ++i)
{
Dist[i] = f;
Heap[i] = Wher[i] = i;
Visi[i] = false;
}
while (!empty(Heap))
{
Visi[u = pop(Heap, Dist, Wher)] = true;
if (Dist[u] == f)
{
break;
}
for (i = 0; i < Neig[u].size(); ++i)
{
if (!Visi[Neig[u][i]])
{
if ((d = Dist[u] + Cost[u][i]) < Dist[Neig[u][i]])
{
Dist[Neig[u][i]] = d;
update(Neig[u][i], Heap, Dist, Wher);
}
}
}
}
for (i = 2; i <= N; ++i)
{
if (Dist[i] == f)
{
Dist[i] = 0;
}
}
}
void write(int Dist[])
{
int i;
ofstream fout("dijkstra.out");
for (i = 2; i <= N; ++i)
{
fout << Dist[i] << ' ';
}
fout << '\n';
fout.close();
}
int main()
{
int Dist[nmax];
read();
solve(Dist);
write(Dist);
return 0;
}