Pagini recente » Rating Rares Gradinaru (Rares_gradinaru) | Cod sursa (job #2629727) | Cod sursa (job #2498822) | Cod sursa (job #1316012) | Cod sursa (job #2705420)
#include <bits/stdc++.h>
#define mp make_pair
#define oo 0x3f3f3f3f
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int n, m;
vector<pair<int ,int > > g[50001];
int d[50001];
bool inq[50001];
int q[500011];
int sz;
void HeapUp(int i)
{
int minn = i;
int p = i / 2;
if(p > 0 && d[q[p]] > d[q[minn]])
{
swap(q[p], q[minn]);
HeapUp(i);
}
}
void HeapDown(int i)
{
int minn = i;
int st = 2 * i;
int dr = 2 * i + 1;
if(st <= n && d[q[st]] < d[q[minn]])
minn = st;
if(dr <= n && d[q[dr]] < d[q[minn]])
minn = dr;
if(minn != i)
{
swap(q[i], q[minn]);
HeapDown(minn);
}
}
inline void push(int val)
{
q[++sz] = val;
HeapUp(sz);
}
inline void pop()
{
q[1] = q[sz--];
HeapDown(1);
}
void Dijkstra(int nod)
{
memset(d, oo, sizeof(d));
push(nod);
inq[nod] = true;
d[nod] = 0;
while(sz > 0)
{
nod = q[1];
pop();
inq[nod] = false;
for(auto i : g[nod])
{
if( d[i.second] > d[nod] + i.first)
{
d[i.second] = d[nod] + i.first;
if(!inq[i.second]){
push(i.second);
inq[i.second] = 1;
}
}
}
}
}
int main()
{
int x, y, w;
fin >> n >> m;
for(int i = 1; i <= m; i++)
{
fin >> x >> y >> w;
g[x].push_back(mp(w, y));
}
Dijkstra(1);
for(int i = 2; i <= n; i++){
if(d[i] != oo)
fout << d[i] << " ";
else fout << "0 ";
}
fin.close();
fout.close();
return 0;
}