Advertisement
Guest User

Untitled

a guest
May 24th, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.65 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <list>
  4. #include <vector>
  5. #include <utility>
  6.  
  7. class Heap {
  8. private:
  9.     std::vector<std::pair<size_t, int>> data;
  10.     std::vector<int> vertIndex;
  11.     size_t heapSize = 0;
  12.     void Heapify(std::vector<std::pair<size_t, int>>& A, size_t length, size_t i) {
  13.         size_t l = 2 * i + 1;
  14.         size_t r = 2 * i + 2;
  15.         size_t smallest = i;
  16.         if (l < length && A[l].second < A[smallest].second)
  17.             smallest = l;
  18.         if (r < length && A[r].second < A[smallest].second)
  19.             smallest = r;
  20.         if (smallest != i) {
  21.             std::swap(A[i], A[smallest]);
  22.             std::swap(vertIndex[A[i].first], vertIndex[A[smallest].first]);
  23.             Heapify(A, length, smallest);
  24.         }
  25.     }
  26.  
  27.     void buildHeap(std::vector<std::pair<size_t, int>> &A, size_t length) {
  28.         for (size_t i = length / 2 - 1; i != (size_t)(-1); --i) {
  29.             Heapify(A, length, i);
  30.         }
  31.     }
  32.  
  33.  
  34. public:
  35.     Heap(size_t size, int vertex = 0) {
  36.         heapSize = size;
  37.         data.resize(size);
  38.         vertIndex.resize(size);
  39.         for (size_t i = 0; i < size; ++i) {
  40.             data[i] = std::pair<size_t, int>(i, vertex);
  41.             vertIndex[i] = i;
  42.         }
  43.     }
  44.  
  45.     template <class InputIt>
  46.     Heap(InputIt begin, InputIt end) {
  47.         size_t length = end - begin;
  48.         heapSize = length;
  49.         vertIndex.resize(length);
  50.         for (size_t i = 0; i < length; ++i) {
  51.             data.push_back(std::pair<size_t, int>(i, *begin));
  52.             vertIndex[i] = i;
  53.             ++begin;
  54.         }
  55.         buildHeap(data, heapSize);
  56.     }
  57.     Heap(std::initializer_list<int> input) {
  58.         size_t length = input.size();
  59.         heapSize = length;
  60.         vertIndex.resize(length);
  61.         auto begin = input.begin();
  62.         for (size_t i = 0; i < length; ++i) {
  63.             data.push_back(std::pair<size_t, int>(i, *begin));
  64.             vertIndex[i] = i;
  65.             ++begin;
  66.         }
  67.         buildHeap(data, heapSize);
  68.     }
  69.  
  70.     bool empty() const {
  71.         return heapSize == 0;
  72.     }
  73.  
  74.     size_t size() const {
  75.         return heapSize;
  76.     }
  77.  
  78.     size_t top() const {
  79.         return data[0].first;
  80.     }
  81.  
  82.     void pop() {
  83.         data[0] = data[heapSize - 1];
  84.         vertIndex[data[0].first] = 0;
  85.         --heapSize;
  86.         Heapify(data, heapSize, 0);
  87.     }
  88.  
  89.  
  90.     void decrease_key(size_t vert, int key) {
  91.         size_t i = vertIndex[vert];
  92.         data[i].second = key;
  93.         while (i > 0 && data[(i-1)/2].second > data[i].second) {
  94.             std::swap(data[(i-1)/2], data[i]);
  95.             std::swap(vertIndex[data[(i-1)/2].first], vertIndex[data[i].first]);
  96.             i = (i-1)/2;
  97.         }
  98.     }
  99. };
  100.  
  101. const int INF = 2147483647;
  102.  
  103. std::vector<int> dijkstra(std::vector<std::list<std::pair<size_t, int>>>& roadGraph,
  104.                           int start) {
  105.     size_t size = roadGraph.size();
  106.     std::vector<int> minPathLen(size, INF);
  107.     Heap vertHeap(size, INF);
  108.     vertHeap.decrease_key(start - 1, 0);
  109.     minPathLen[start - 1] = 0;
  110.     while  (!vertHeap.empty()) {
  111.         size_t vertex = vertHeap.top();
  112.         vertHeap.pop();
  113.         for (auto vert : roadGraph[vertex]) {
  114.             if (minPathLen[vert.first] > minPathLen[vertex] + vert.second) {
  115.                 vertHeap.decrease_key(vert.first, minPathLen[vertex] + vert.second);
  116.                 minPathLen[vert.first] = minPathLen[vertex] + vert.second;
  117.             }
  118.         }
  119.     }
  120.     return minPathLen;
  121. }
  122.  
  123. int calculate_min_cost() {
  124.     int buildingsNum, roadsNum;
  125.     std::cin >> buildingsNum >> roadsNum;
  126.     std::vector<std::list<std::pair<size_t, int>>> roadGraph(buildingsNum);
  127.     int buildingA, buildingB;
  128.     for (; roadsNum > 0; --roadsNum) {
  129.         std::cin >> buildingA >> buildingB;
  130.         roadGraph[buildingA - 1].push_back(std::pair<size_t, int>(buildingB - 1, 0));
  131.         roadGraph[buildingB - 1].push_back(std::pair<size_t, int>(buildingA - 1, 0));
  132.     }
  133.     int newRoadsNum, roadPrice;
  134.     std::cin >> newRoadsNum;
  135.     for (; newRoadsNum > 0; --newRoadsNum) {
  136.         std::cin >> buildingA >> buildingB >> roadPrice;
  137.         roadGraph[buildingA - 1].push_back(std::pair<size_t, int>(buildingB - 1, roadPrice));
  138.         roadGraph[buildingB - 1].push_back(std::pair<size_t, int>(buildingA - 1, roadPrice));
  139.     }
  140.     int start, finish;
  141.     std::cin >> start >> finish;
  142.     std::vector<int> minPathlen = dijkstra(roadGraph, start);
  143.     if (minPathlen[finish - 1] == INF) {
  144.         return -1;
  145.     } else {
  146.         return minPathlen[finish - 1];
  147.     }
  148. }
  149.  
  150. int main() {
  151.     int buildingsNum, roadsNum;
  152.     std::cin >> buildingsNum >> roadsNum;
  153.     std::vector<std::list<std::pair<size_t, int>>> roadGraph(buildingsNum);
  154.     int buildingA, buildingB;
  155.     for (; roadsNum > 0; --roadsNum) {
  156.         std::cin >> buildingA >> buildingB;
  157.         roadGraph[buildingA - 1].push_back(std::pair<size_t, int>(buildingB - 1, 0));
  158.         roadGraph[buildingB - 1].push_back(std::pair<size_t, int>(buildingA - 1, 0));
  159.     }
  160.     int newRoadsNum, roadPrice;
  161.     std::cin >> newRoadsNum;
  162.     for (; newRoadsNum > 0; --newRoadsNum) {
  163.         std::cin >> buildingA >> buildingB >> roadPrice;
  164.         roadGraph[buildingA - 1].push_back(std::pair<size_t, int>(buildingB - 1, roadPrice));
  165.         roadGraph[buildingB - 1].push_back(std::pair<size_t, int>(buildingA - 1, roadPrice));
  166.     }
  167.     int start, finish;
  168.     std::cin >> start >> finish;
  169.     std::vector<int> minPathlen = dijkstra(roadGraph, start);
  170.     if (minPathlen[finish - 1] == INF) {
  171.         std::cout << -1;
  172.     } else {
  173.         std::cout << minPathlen[finish - 1];
  174.     }
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement