Advertisement
dan_sml

Sem_2_Task_6

Apr 29th, 2022
674
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <set>
  5.  
  6. struct Edge;
  7.  
  8. const size_t INF = size_t(1e12);
  9.  
  10. namespace {
  11.     using NumsVec = std::vector<size_t>;
  12.     using VecNumsVec = std::vector<NumsVec>;
  13.     using DoubleVec = std::vector<long double>;
  14.     using VecDoubleVec = std::vector<DoubleVec>;
  15.     using BoolVec = std::vector<bool>;
  16.     using EdgeVec = std::vector<Edge>;
  17. }
  18.  
  19. struct Edge {
  20.     Edge() = default;
  21.     Edge(std::pair<size_t, size_t> edge) : from(edge.first), to(edge.second) {};
  22.     Edge(size_t i, size_t j, size_t w, size_t u) : from(i), to(j) {};
  23.  
  24.     bool operator==(const Edge& other) const {
  25.         return from == other.from && to == other.to;
  26.     }
  27.  
  28.     size_t from = 0;
  29.     size_t to = 0;
  30.     long double risk = 1;
  31. };
  32.  
  33. std::istream& operator>>(std::istream& input, Edge& p) {
  34.     input >> p.from >> p.to >> p.risk;
  35.     --p.from;
  36.     --p.to;
  37.     p.risk /= 100;
  38.     return input;
  39. }
  40.  
  41. void InputEdges(std::vector<Edge>& edges) {
  42.     for (auto& edge : edges) {
  43.         std::cin >> edge;
  44.     }
  45. }
  46.  
  47. template<>
  48. struct std::hash<Edge> {
  49.     size_t operator()(const Edge& p) const {
  50.         return p.from * p.to;
  51.     }
  52. };
  53.  
  54. std::ostream& operator<<(std::ostream& output, NumsVec& vec) {
  55.     for (auto elem : vec) {
  56.         std::cout << elem + 1 << " ";
  57.     }
  58.     return output;
  59. }
  60.  
  61. struct Graph {
  62.     Graph(size_t n) : size(n), visited(n, false), color(n, 0),
  63.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF) {};
  64.  
  65.     Graph(size_t n, EdgeVec& edges) : size(n), visited(n, false), color(n, 0),
  66.     top_sort(n, 0), top_sort_pos(n - 1), d(n, INF), matrix(n, DoubleVec(n, 1)), neighbours(n) {
  67.         for (auto edge : edges) {
  68.             matrix[edge.from][edge.to] = edge.risk;
  69.             matrix[edge.to][edge.from] = edge.risk;
  70.             neighbours[edge.from].push_back(edge.to);
  71.             neighbours[edge.to].push_back(edge.from);
  72.         }
  73.         for (size_t v = 0; v < n; ++v) {
  74.             matrix[v][v] = 0;
  75.         }
  76.     };
  77.  
  78.     size_t size = 0;
  79.     bool cycle = false;
  80.  
  81.     VecDoubleVec matrix;
  82.     VecNumsVec neighbours;
  83.     BoolVec visited;
  84.     NumsVec color;
  85.     NumsVec top_sort;
  86.     NumsVec d;
  87.     size_t top_sort_pos = 0;
  88. };
  89.  
  90. void Floyd(Graph& g) {
  91.     for (size_t k = 0; k < g.size; ++k) {
  92.         for (size_t u = 0; u < g.size; ++u) {
  93.             for (size_t v = 0; v < g.size; ++v) {
  94.                 g.matrix[u][v] = std::min(g.matrix[u][v], 1 - (1 - g.matrix[u][k]) * (1 - g.matrix[k][v]));
  95.             }
  96.         }
  97.     }
  98. }
  99.  
  100. int main() {
  101.     size_t n, m, s, t;
  102.     std::cin >> n >> m >> s >> t;
  103.     EdgeVec edges(m);
  104.     InputEdges(edges);
  105.     Graph g(n, edges);
  106.     Floyd(g);
  107.     std::cout << g.matrix[s - 1][t - 1];
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement