Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <tuple>
  5. #include <queue>
  6.  
  7. using namespace std;
  8. struct graph {
  9.  
  10. graph(size_t nodes)
  11. : m_adjacency_list(nodes) {
  12. }
  13.  
  14. size_t number_of_nodes() const {
  15. return m_adjacency_list.size();
  16. }
  17.  
  18. vector<size_t> const &neighbours_of(size_t node) const {
  19. return m_adjacency_list.at(node);
  20. }
  21.  
  22. void add_edge(size_t from, size_t to) {
  23. vector<size_t> &al = m_adjacency_list.at(from);
  24. if (to >= m_adjacency_list.size())
  25. throw runtime_error("Tried to add edge to non-existant node");
  26. for (size_t i = 0; i < al.size(); ++i) if (al[i] == to) return;
  27. al.push_back(to);
  28. }
  29.  
  30. private:
  31.  
  32. vector<vector<size_t>> m_adjacency_list;
  33. };
  34. int main() {
  35. int left = 0; // Broj pjesackih na lijevoj strani
  36. int right = 0; // Broj pjesackih na desnoj strani
  37. int middle = 0; // Broj pjesackih koji povezuju lijevu i desnu stranu
  38. int f = 7; // Kucni broj na koji treba dostaviti
  39. int targetPos = 0;
  40. int itterator = 0;
  41.  
  42. std::cin >> left >> right >> middle;
  43. std::vector<int> inputs(left+right+middle);
  44.  
  45. // Input za lijevu stranu
  46. for (auto &a : inputs) {
  47. std::cin >> a;
  48. }
  49. std::cin >> targetPos;
  50.  
  51. // Kreiranje Grafa
  52.  
  53. graph g(left+right+middle);
  54. std::cout<<"LIJEVI"<<std::endl;
  55. for (itterator; itterator<left; itterator++){
  56. g.add_edge(itterator, itterator+1);
  57. g.add_edge(itterator+1, itterator);
  58. std::cout << "addingGraph(" << itterator << "," << itterator+1 << ");" << std::endl;
  59. std::cout << "addingGraph(" << itterator+1 << "," << itterator << ");" << std::endl;
  60. }
  61. std::cout<<std::endl;
  62. std::cout<<"DESNI"<<std::endl;
  63. for (itterator; itterator<left+right; itterator++){
  64. g.add_edge(itterator+1, itterator+1+1);
  65. g.add_edge(itterator+1+1, itterator+1);
  66. std::cout << "addingGraph(" << itterator+1 << "," << itterator+1+1 << ");" << std::endl;
  67. std::cout << "addingGraph(" << itterator+1+1 << "," << itterator+1 << ");" << std::endl;
  68. }
  69. std::cout<<std::endl;
  70.  
  71. for (int i = left + right; i < left + right + middle; ++i) {
  72. auto as_tuple = [&, i](int e) {
  73. return std::make_tuple(e < inputs[i], std::abs(e - inputs[i]));
  74. };
  75. auto comparer = [&, i](int lhs, int rhs){
  76. return as_tuple(lhs) < as_tuple(rhs);
  77. };
  78. auto it1 = std::min_element(inputs.begin(), inputs.begin() + left, comparer);
  79. auto it2 = std::min_element(inputs.begin() + left,
  80. inputs.begin() + left + right,
  81. comparer);
  82. // Assuming non-empty ranges: else check left, right with 0
  83. std::cout << *it1 << ", " << *it2
  84. << " --> index "
  85. << std::distance(inputs.begin(), it1) << ", "
  86. << std::distance(inputs.begin(), it2) << std::endl;
  87. int leftIndex = 0;
  88. int rightIndex = 0;
  89. if(*it1<inputs[i]){
  90. leftIndex = std::distance(inputs.begin(), it1)+1;
  91. }
  92. else if(*it1>=inputs[i]){
  93. leftIndex = std::distance(inputs.begin(), it1);
  94. }
  95. if(*it2<inputs[i]){
  96. rightIndex = std::distance(inputs.begin(), it2)+left+1;
  97. }
  98. else if(*it1>=inputs[i]){
  99. rightIndex = std::distance(inputs.begin(), it2+left);
  100. }
  101. g.add_edge(leftIndex, rightIndex);
  102. g.add_edge(rightIndex, leftIndex);
  103. std::cout << "addingGraph(" << leftIndex << "," << rightIndex << ");" << std::endl;
  104.  
  105. }
  106. std::cout<<std::endl;
  107. std::cout << '\n';
  108.  
  109. // BFS
  110. vector<size_t> reached_by(g.number_of_nodes(), g.number_of_nodes());
  111. queue<size_t> q;
  112. size_t start = 0;
  113.  
  114. int i = 5;
  115. auto as_tuple = [&, i](int e) { return std::make_tuple(e < targetPos,
  116. std::abs(e - targetPos));};
  117. auto comparer = [&, i](int lhs, int rhs){ return as_tuple(lhs) < as_tuple(rhs); };
  118. auto it1 = std::min_element(inputs.begin(), inputs.begin() + left, comparer);
  119. auto it2 = std::min_element(inputs.begin() + left,
  120. inputs.begin() + left + right,
  121. comparer);
  122. std::cout << *it1 << ", " << *it2
  123. << " --> index "
  124. << std::distance(inputs.begin(), it1) << ", "
  125. << std::distance(inputs.begin(), it2) << std::endl;
  126. int targetIndex = 0;
  127. if(targetPos<=*it2){
  128. targetIndex = std::distance(inputs.begin(), it2)+1;
  129.  
  130. }
  131. else{
  132. targetIndex = std::distance(inputs.begin(), it2);
  133. }
  134. std::cout<<"TARGET: "<<targetIndex;
  135. size_t target = targetIndex;
  136. reached_by[start] = start;
  137. q.push(start);
  138. while (!q.empty()) {
  139. size_t node = q.front();
  140. q.pop();
  141. for (size_t i = 0; i < g.neighbours_of(node).size(); ++i) {
  142. size_t candidate = g.neighbours_of(node)[i];
  143. if (reached_by[candidate] == g.number_of_nodes()) {
  144. reached_by[candidate] = node;
  145. if (candidate == target) break;
  146. q.push(candidate);
  147. }
  148. }
  149. }
  150.  
  151. if (reached_by[target] == g.number_of_nodes())
  152. cout << "No path to " << target << " found!" << endl;
  153. else {
  154. int totalCount = 0;
  155. for (size_t node = target; node != start; node = reached_by[node]) {
  156. totalCount++;
  157. }
  158. std::cout<<std::endl;
  159. cout << totalCount << endl;
  160. }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement