Pagini recente » Cod sursa (job #2614613) | Cod sursa (job #944621) | Cod sursa (job #2140030) | Cod sursa (job #2032716) | Cod sursa (job #2285467)
#include <cstdio>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
void read(int &n, int &m, vector<vector<pair<int, int> > > &graph) {
int source, target, cost;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
graph.push_back(vector<pair<int, int> >());
}
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &source, &target, &cost);
graph[source - 1].push_back(make_pair(cost, target - 1));
}
}
vector<int> dijkstra(vector<vector<pair<int, int> > > graph, int start_node) {
vector<int> cost(graph.size(), INF);
priority_queue<pair<int, int> > fringe;
int current_node;
fringe.push(make_pair(0, start_node));
cost[start_node] = 0;
while (!fringe.empty()) {
current_node = fringe.top().second;
fringe.pop();
for (vector<pair<int, int> >::iterator it = graph[current_node].begin(); it != graph[current_node].end(); it++) {
if (cost[it->second] > cost[current_node] + it->first) {
cost[it->second] = cost[current_node] + it->first;
fringe.push(make_pair(-cost[it->second], it->second));
}
}
}
return cost;
}
int main() {
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
int n, m;
vector<vector<pair<int, int> > > graph;
vector<int> answer;
read(n, m, graph);
answer = dijkstra(graph, 0);
for (vector<int>::iterator it = answer.begin(); it != answer.end(); it++) {
if (!*it) {
continue;
} else if (*it == INF) {
printf("0 ");
} else {
printf("%d ", *it);
}
}
}