Pagini recente » Cod sursa (job #2926158) | Cod sursa (job #2288196) | Cod sursa (job #854107) | Cod sursa (job #2305841) | Cod sursa (job #877955)
Cod sursa(job #877955)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define FORIT(it,v) for(typeof((v).begin())it=(v).begin();it!=(v).end();++it)
const int MAX_N = 50100;
const int INF = 1 << 30;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int N, M;
vector<pair<int, int> > graph[MAX_N];
int cost[MAX_N];
bool visited[MAX_N];
bool in_heap[MAX_N];
void read_input();
void dijkstra(int start_node);
void print_output();
int main() {
read_input();
dijkstra(1);
print_output();
return 0;
}
void read_input() {
fin >> N >> M;
for (int i = 1; i <= M; ++i) {
int a, b, c;
fin >> a >> b >> c;
graph[a].push_back(make_pair(b, c));
graph[b].push_back(make_pair(a, c));
}
}
struct HeapCmp {
bool operator() (const int& lhs, const int& rhs) const {
return cost[lhs] > cost[rhs];
}
};
void dijkstra(int start_node) {
fill(cost, cost + N + 1, INF);
cost[start_node] = 0;
priority_queue<int, vector<int>, HeapCmp> heap;
heap.push(start_node);
in_heap[start_node] = true;
while (!heap.empty()) {
int node = heap.top();
heap.pop();
visited[node] = true;
FORIT (it, graph[node]) {
if (!visited[it->first]) {
cost[it->first] = min(cost[it->first], cost[node] + it->second);
if (!in_heap[it->first]) heap.push(it->first);
}
}
}
}
void print_output() {
for (int i = 2; i <= N; ++i) {
fout << (cost[i] == INF ? 0 : cost[i]) << ' ';
}
}