Pagini recente » Cod sursa (job #1103139) | Cod sursa (job #2675728) | Cod sursa (job #1814225) | Cod sursa (job #2643717) | Cod sursa (job #3236669)
#include <fstream>
#include <vector>
using namespace std;
using edge = pair<int, int>;
static constexpr int nMAX = ((int)(5e4) + 1);
static constexpr int INF = ((int)(1e9));
int n;
vector<edge> G[nMAX];
int d[nMAX];
bool vizited[nMAX];
static inline void add_edge(const int x, const int y, const int c)
{
G[x].push_back({c, y});
return;
}
static inline void read()
{
ifstream f("dijkstra.in");
f.tie(nullptr);
f >> n;
int m = 0;
f >> m;
int u = 0, v = 0, c = 0;
for (int i = 1; i <= m; ++i)
f >> u >> v >> c, add_edge(u, v, c);
return;
}
static inline void init()
{
for (int i = 1; i <= n; ++i)
d[i] = INF, vizited[i] = false;
return;
}
static inline void dijkstra(const int S)
{
init();
d[S] = 0;
int min_node = 0, min_dist = 0;
for (int i = 1; i <= n; ++i)
{
min_node = -1, min_dist = INF;
for (int j = 1; j <= n; ++j)
if (!vizited[j])
if (d[j] < min_dist)
min_node = j, min_dist = d[j];
if (min_node == -1)
break;
vizited[min_node] = true;
for (const edge &x : G[min_node])
if (!vizited[x.second])
if ((x.first + d[min_node]) < d[x.second])
d[x.second] = (x.first + d[min_node]);
}
return;
}
int main()
{
read();
dijkstra(1);
ofstream g("dijkstra.out");
g.tie(nullptr);
for (int i = 2; i <= n; ++i)
{
g << ((d[i] == INF) ? 0 : d[i]);
if (i != n)
g << ' ';
else
g << '\n';
}
return 0;
}