Pagini recente » Cod sursa (job #1495604) | Cod sursa (job #2293728) | Cod sursa (job #477653)
Cod sursa(job #477653)
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <deque>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <iterator>
using namespace std;
template<typename T>
void printV(const vector<T> &v) {
for (size_t i = 0; i < v.size(); ++i) {
cout << v[i] << " ";
}
cout << endl;
}
class dijkstra {
private:
typedef vector<int> VI;
typedef vector<int>::iterator VIIt;
typedef pair<int, int> Edge;
typedef map<Edge, int> CostFunc;
typedef vector<VI> Graf;
static const int INF = ~(1 << 31);
Graf g;
CostFunc w;
class Hash {
public:
Hash() : hash() {}
pair<int, int> extractMinimum() {
Node n = *hash.begin();
hash.erase(hash.begin());
return n;
}
void insertNode(int v, int d) {
insertKey(v, d);
hash.insert(Node(d, v));
}
void updateNode(int v, int d) {
HashSetIt it = hash.find(Node(key[v], v));
if (it != hash.end()) {
hash.erase(it);
}
insertKey(v, d);
hash.insert(Node(d, v));
}
int getKey(int v) {
return key[v];
}
vector<int> getKeys() {
return key;
}
bool empty() {
return hash.empty();
}
private:
typedef pair<int, int> Node;
typedef set<Node> HashSet;
typedef HashSet::iterator HashSetIt;
HashSet hash;
VI key;
void insertKey(int v, int d) {
if (v >= (int)key.size()) {
key.resize(v + 1);
}
key[v] = d;
}
};
void buildGraph(ifstream &in) {
int n, m;
in >> n >> m;
Graf(n, VI()).swap(g);
for (int i = 0; i < m; ++i) {
int x, y, c;
in >> x >> y >> c;
if (x == y) {
continue;
}
g[x - 1].push_back(y - 1);
w.insert(pair<Edge, int>(Edge(x - 1, y - 1), c));
w.insert(pair<Edge, int>(Edge(y - 1, x - 1), c));
}
}
public:
void func_dijkstra(ifstream &in, ofstream &out) {
buildGraph(in);
Hash h;
for (size_t i = 0; i < g.size(); ++i) {
h.insertNode(i, INF);
}
h.updateNode(0, 0);
VI p(g.size(), -1);
VI vis(g.size(), 0);
p[0] = -1;
vis[0] = 1;
while (!h.empty()) {
pair<int, int> node = h.extractMinimum();
int u = node.second;
int d = node.first;
for (size_t i = 0; i < g[u].size(); ++i) {
int v = g[u][i];
if (vis[v] == 0) {
vis[v] = 1;
int r = d + w[Edge(u, v)];
if (h.getKey(v) > r) {
h.updateNode(v, r);
p[v] = u;
}
}
}
}
VI d = h.getKeys();
copy(d.begin() + 1, d.end(), ostream_iterator<int>(out, " "));
}
};
int main() {
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
dijkstra x; x.func_dijkstra(in, out);
}