Pagini recente » Cod sursa (job #1561283) | Cod sursa (job #2946914) | Cod sursa (job #1382718) | Cod sursa (job #3167940) | Cod sursa (job #2807414)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
typedef pair < int, int > PII;
const int NMAX = 5e4 + 1, ROOT = 1;
const int INF = 1e9;
int N, M;
vector < PII > G[NMAX];
bool Sel[NMAX];
int d[NMAX];
auto cmp = [] (PII A, PII B)
{
if(!(A.first < B.first))
return 1;
return 0;
};
priority_queue < PII, vector < PII >, decltype(cmp) > H(cmp);
static inline void Read ()
{
f.tie(nullptr);
f >> N >> M;
for(int i = 1; i <= M; ++i)
{
int a = 0, b = 0, c = 0;
f >> a >> b >> c;
G[a].push_back({c, b});
}
return;
}
static inline void Initialize ()
{
for(int i = 1; i <= N; ++i)
Sel[i] = false, d[i] = INF;
return;
}
static inline void Dijkstra (int S)
{
Initialize();
Sel[1] = true;
d[1] = 0;
for(auto it : G[S])
if(it.first < d[it.second])
d[it.second] = it.first, H.push(it);
while(!H.empty())
{
while(!H.empty() && Sel[H.top().second])
H.pop();
if(H.empty())
break;
PII Top = H.top();
int Node = Top.second, Cost = Top.first;
Sel[Node] = 1, H.pop();
for(auto it : G[Node])
if(Cost + it.first < d[it.second])
d[it.second] = Cost + it.first, H.push({d[it.second], it.second});
}
return;
}
static inline void Write ()
{
for(int i = 2; i <= N; ++i)
{
g << ((d[i] != INF) ? d[i] : 0);
if(i != N)
g << ' ';
}
g << '\n';
return;
}
int main()
{
Read();
Dijkstra(ROOT);
Write();
return 0;
}