Pagini recente » Cod sursa (job #1604538) | Cod sursa (job #889450) | Cod sursa (job #772922) | Cod sursa (job #276984) | Cod sursa (job #2898112)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
#include <vector>
using namespace std;
const int inf = 1 << 30;
const int NMAX = 50005;
struct edge
{
int dest;
int cost;
};
struct dist
{
int node;
int dist;
};
inline bool operator<(const dist& a, const dist& b)
{
if (a.dist == b.dist) {
return a.node < b.node;
}
return a.dist < b.dist;
}
int n, m;
vector<edge> adj[NMAX];
int viz[NMAX];
int d[NMAX];
set<dist> s;
void dijkstra(int start_node)
{
for (int i = 1; i <= n; i++)
{
viz[i] = 0;
if (i != start_node)
d[i] = inf;
else
d[i] = 0;
s.insert({ i, d[i] });
}
while (s.size() > 0)
{
int node = (*s.begin()).node;
if (viz[node] || d[node] == inf)
break;
for (auto it = adj[node].begin(); it != adj[node].end(); it++) {
edge edge_next = *it;
if (!viz[edge_next.dest] && d[edge_next.dest] > d[node] + edge_next.cost) {
d[edge_next.dest] = d[node] + edge_next.cost;
s.insert({ edge_next.dest, d[edge_next.dest] });
}
}
viz[node] = 1;
s.erase({ node, d[node] });
}
}
int main()
{
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
int node1, node2, cost;
for (int i = 1; i <= m; i++) {
cin >> node1 >> node2 >> cost;
adj[node1].push_back({ node2, cost });
adj[node2].push_back({ node1, cost });
}
dijkstra(1);
// Print lengths.
for (int i = 2; i <= n; i++) {
if (d[i] == inf)
cout << 0 << ' ';
else
cout << d[i] << ' ';
}
return 0;
}