Pagini recente » Istoria paginii utilizator/mihaela_narita | Cod sursa (job #480006) | Cod sursa (job #762945) | Cod sursa (job #1649040) | Cod sursa (job #1693314)
#include <iostream>
#include <fstream>
#include <list>
#include <vector>
#include <queue>
#include <functional>
#define SIZE 100
#define INF 32000
/* Define globally */
std::vector<std::pair<long, long> > graph[SIZE];
long dist[SIZE];
bool marked[SIZE]; // initially false, which is OK
void print_graph(long nr_vert) {
for (long i = 0; i < nr_vert; i++) {
std::cout << i << ": ";
for (long j = 0; j < graph[i].size(); j++)
std::cout << "(" << i << "," << graph[i][j].first << "," << graph[i][j].second << ") ";
std::cout << "\n";
}
}
// Make custom comparator
// (dst, cost) = (first, second)
struct comp {
bool operator() (const std::pair<long, long>& left, const std::pair<long, long>& right) {
return left.second > right.second;
}
};
void dijkstra(long nr_vert, long src) {
std::priority_queue<std::pair<long, long>, std::vector<std::pair<long, long>>, comp> q;
// (vert, distance)
std::pair<long, long> crt_vert;
long already_marked = 0;
for (long i = 1; i <= nr_vert; i++)
dist[i] = INF;
dist[src] = 0;
q.push(std::make_pair(src, dist[src]));
while (already_marked < nr_vert) {
// Find first unprocessed
while (!q.empty()) {
crt_vert = q.top();
q.pop();
if (marked[crt_vert.first] == false)
break;
}
marked[crt_vert.first] = true;
already_marked++;
// (vert, distance) = crt_vert
// (dst, cost) = (first, second)
for (long i = 0; i < graph[crt_vert.first].size(); i++)
if (dist[graph[crt_vert.first][i].first] > (dist[crt_vert.first] + graph[crt_vert.first][i].second)) {
dist[graph[crt_vert.first][i].first] = (dist[crt_vert.first] + graph[crt_vert.first][i].second);
q.push(std::make_pair(graph[crt_vert.first][i].first, dist[graph[crt_vert.first][i].first]));
}
}
}
int main(void) {
freopen("dijkstra.in", "r", stdin);
freopen("dijkstra.out", "w", stdout);
long nr_vert;
long nr_edges;
long src, dst, cost;
std::cin >> nr_vert >> nr_edges;
// Unoriented graph
for (long i = 0; i < nr_edges; i++) {
std::cin >> src >> dst >> cost;
graph[src].push_back(std::make_pair(dst, cost));
}
dijkstra(nr_vert, 1);
for (long i = 2; i <= nr_vert; i++)
std::cout << dist[i] << " ";
return 0;
}