Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.57 KB | None | 0 0
  1. #include <deque>
  2. #include <vector>
  3. #include <utility>
  4. #include <iostream>
  5. #include <unordered_map>
  6.  
  7. std::vector<std::unordered_map<int, int>> ReadGraph(int number_nodes, int number_edges) {
  8. std::vector<std::unordered_map<int, int>> edges(
  9. static_cast<size_t>(number_nodes) + number_edges + 1);
  10. std::vector<std::pair<int, int>> double_weight;
  11. int start, finish, weight;
  12. while (number_edges--) {
  13. std::cin >> start >> finish >> weight;
  14. --start;
  15. --finish;
  16. if (start != finish && (edges[start].find(finish) == edges[start].end() ||
  17. edges[start].at(finish) > weight)) {
  18. if (weight < 2) {
  19. edges[start][finish] = weight;
  20. } else if (weight == 2) {
  21. double_weight.emplace_back(start, finish);
  22. }
  23. }
  24. }
  25. auto new_node = number_nodes;
  26. for (const auto& edge : double_weight) {
  27. if (edges[edge.first].find(edge.second) == edges[edge.first].end()) {
  28. edges[edge.first][++new_node] = 1;
  29. edges[new_node][edge.second] = 1;
  30. }
  31. }
  32. return edges;
  33. }
  34.  
  35. void BFS(std::vector<std::unordered_map<int, int>>& edges, int start,
  36. int finish, int number_nodes, int numer_edges) {
  37. std::deque<int> deque;
  38. deque.emplace_back(start);
  39. std::vector<bool> used(static_cast<size_t>(number_nodes) + numer_edges + 1, false);
  40. std::vector<int> paths_weights(static_cast<size_t>(number_nodes) + numer_edges + 1);
  41. used[start] = true;
  42. while (!deque.empty()) {
  43. int from = deque.front();
  44. deque.pop_front();
  45. for (const auto& edge : edges[from]) {
  46. if (!used[edge.first]) {
  47. used[edge.first] = true;
  48. edge.second == 0 ? deque.push_front(edge.first) : deque.push_back(edge.first);
  49. paths_weights[edge.first] = paths_weights[from] + edge.second;
  50. }
  51. }
  52. }
  53. if (!used[finish]) {
  54. std::cout << -1 << "\n";
  55. } else {
  56. std::cout << paths_weights[finish] << "\n";
  57. }
  58. }
  59.  
  60. void MakeSolution() {
  61. int number_nodes, number_edges;
  62. std::cin >> number_nodes >> number_edges;
  63. auto edges = ReadGraph(number_nodes, number_edges);
  64. int numer_requests, start, finish;
  65. std::cin >> numer_requests;
  66. while (numer_requests--) {
  67. std::cin >> start >> finish;
  68. BFS(edges, --start, --finish, number_nodes, number_edges);
  69. }
  70. }
  71.  
  72. int main() {
  73. std::ios::sync_with_stdio(false);
  74. std::cin.tie(nullptr);
  75. MakeSolution();
  76. return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement