Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <set>
- struct Edge;
- const size_t INF = size_t(1e12);
- namespace {
- using NumsVec = std::vector<size_t>;
- using VecNumsVec = std::vector<NumsVec>;
- using BoolVec = std::vector<bool>;
- using EdgeVec = std::vector<Edge>;
- using VecEdgeVec = std::vector<EdgeVec>;
- }
- struct Edge {
- Edge() = default;
- Edge(std::pair<size_t, size_t> edge) : from(edge.first), to(edge.second) {};
- Edge(size_t i, size_t j, size_t w) : from(i), to(j), w(w) {};
- bool operator==(const Edge& other) const {
- return from == other.from && to == other.to;
- }
- size_t from = 0;
- size_t to = 0;
- size_t w = 0;
- };
- std::istream& operator>>(std::istream& input, Edge& p) {
- input >> p.from >> p.to >> p.w;
- --p.from;
- --p.to;
- return input;
- }
- void InputEdges(std::vector<Edge>& edges) {
- for (auto& edge : edges) {
- std::cin >> edge;
- }
- }
- template<>
- struct std::hash<Edge> {
- size_t operator()(const Edge& p) const {
- return p.from * p.to;
- }
- };
- std::ostream& operator<<(std::ostream& output, NumsVec& vec) {
- for (auto elem : vec) {
- std::cout << elem + 1 << " ";
- }
- return output;
- }
- struct Graph {
- Graph(size_t n) : size(n), neighbours(n), visited(n, false), color(n, 0),
- top_sort(n, 0), top_sort_pos(n - 1), d(n, INF) {};
- Graph(size_t n, VecNumsVec& matrix) : size(n), visited(n, false), color(n, 0),
- top_sort(n, 0), top_sort_pos(n - 1), d(n, INF), neighbours(n) {
- for (size_t v = 0; v < n; ++v) {
- for (size_t u = 0; u < n; ++u) {
- sum_w += matrix[v][u];
- if (matrix[v][u] != 0 || v == u) {
- neighbours[v].push_back(Edge(v, u, matrix[v][u]));
- }
- }
- }
- };
- size_t size = 0;
- bool cycle = false;
- std::vector<EdgeVec> neighbours;
- BoolVec visited;
- NumsVec color;
- NumsVec top_sort;
- NumsVec d;
- size_t sum_w = 0;
- size_t top_sort_pos = 0;
- };
- int64_t Dijkstra(Graph& g, size_t s, size_t f) {
- g.d[s] = 0;
- std::set<std::pair<size_t, size_t>> vert;
- vert.insert({g.d[s], s});
- while (!vert.empty()) {
- size_t v = vert.begin()->second;
- vert.erase(vert.begin());
- for (auto edge : g.neighbours[v]) {
- if (g.d[edge.to] > g.d[v] + edge.w) {
- vert.erase({g.d[edge.to], edge.to});
- g.d[edge.to] = g.d[v] + edge.w;
- vert.insert({g.d[edge.to], edge.to});
- }
- }
- }
- if (g.d[f] == INF) {
- return g.sum_w;
- }
- return g.d[f];
- }
- int main() {
- size_t n;
- std::cin >> n;
- VecNumsVec matr(n, NumsVec(n, 0));
- for (size_t i = 0; i < n; ++i) {
- for (size_t j = 0; j < n; ++j) {
- std::cin >> matr[i][j];
- }
- }
- Graph g(n, matr);
- int64_t cheapest_way = Dijkstra(g, 0, 1);
- std::cout << g.sum_w - cheapest_way;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement