Pagini recente » Cod sursa (job #724857) | 2020 | Statistici Andrei Vasile (micutu) | Cod sursa (job #2961592) | Cod sursa (job #2037327)
#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <climits>
#include <set>
const int maxn = 50001;
const int inf = 1 << 30;
FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w");
using namespace std;
class Graph
{
public:
std::list<std::pair<int, int> >* neigh;
int n;
Graph(int n) {
neigh = new std::list<std::pair<int, int>> [n + 1];
this->n = n + 1;
}
void addEdge(int u, int v, int w) {
neigh[u].push_back(make_pair(v, w));
}
void shortestPath(int source) {
// const auto comparator = [](const pair<int, int> a, const pair<int, int> b) {
// return a.second > b.second;
// };
struct comparator
{
bool operator () (const pair<int, int> a, const pair<int, int> b)
{
return a.second < b.second;
}
};
set<pair<int, int>, comparator> pq;
vector<int> distance(n, INT_MAX -1);
vector<bool> visited(n, false);
distance[source] = 0;
visited[source] = true;
pq.insert(make_pair(source, 0));
while(!pq.empty()) {
auto node = *pq.begin();
pq.erase(pq.begin());
for (const auto& child : neigh[node.first]) {
if (distance[child.first] > distance[node.first] + child.second) {
if (visited[child.first] ) {
std::cout << "Search " <<child.first << " " << distance[child.first] << " " << "\n";
std::set<pair<int, int>, comparator>::iterator it = pq.find({child.first, distance[child.first]});
pq.erase(it);
}
distance[child.first] = distance[node.first] + child.second;
visited[child.first] = true;
std::cout << "Insert " <<child.first << " " << distance[child.first] << "\n";
pq.insert(make_pair(child.first, distance[child.first]));
}
}
}
for ( int i = 2; i < n; ++i)
fprintf(out, "%d ", distance[i] == INT_MAX -1 ? 0 : distance[i]);
fprintf(out, "\n");
}
};
int main()
{
int n, m;
fscanf(in, "%d %d", &n, &m);
Graph g(n);
int x, y, z;
for ( int i = 0; i < m; ++i )
{
fscanf(in, "%d %d %d", &x, &y, &z);
g.addEdge(x, y, z);
}
g.shortestPath(1);
return 0;
}