Pagini recente » Cod sursa (job #173757) | Cod sursa (job #3130845) | Cod sursa (job #587779) | Cod sursa (job #3202382) | Cod sursa (job #2856945)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3F3F3F3F
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
const int N_MAX = 5e4 + 1;
int n, m;
int dist[N_MAX];
bool in_queue[N_MAX];
struct compare {
bool operator () (int x, int y) {
return dist[x] > dist[y];
}
};
priority_queue<int, vector<int>, compare> P;
vector<pair<int, int> > edge[N_MAX];
void read() {
fin >> n >> m;
int x, y, cost;
for (int i = 1; i <= m; i++)
fin >> x >> y >> cost,
edge[x].push_back(make_pair(y, cost)),
edge[y].push_back(make_pair(x, cost));
}
void init() {
for (int i = 1; i <= n; i++)
dist[i] = INF;
}
void dijkstra(int node) {
dist[node] = 0;
P.push(node);
in_queue[node] = true;
while (!P.empty()) {
int current_node = P.top();
P.pop();
in_queue[current_node] = false;
for (size_t i = 0; i < edge[current_node].size(); i++) {
int neighbour = edge[current_node][i].first;
int cost = edge[current_node][i].second;
if (dist[neighbour] > dist[current_node] + cost) {
dist[neighbour] = dist[current_node] + cost;
if (in_queue[neighbour] == false)
P.push(neighbour),
in_queue[neighbour] = true;
}
}
}
}
void solve() {
init();
dijkstra(1);
}
void display() {
for (int i = 2; i <= n; i++)
fout << dist[i] << " ";
}
int main()
{
read();
solve();
display();
fin.close();
fout.close();
return 0;
}