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 DoubleVec = std::vector<long double>;
- using VecDoubleVec = std::vector<DoubleVec>;
- using BoolVec = std::vector<bool>;
- using EdgeVec = std::vector<Edge>;
- }
- 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, size_t u) : from(i), to(j) {};
- bool operator==(const Edge& other) const {
- return from == other.from && to == other.to;
- }
- size_t from = 0;
- size_t to = 0;
- long double risk = 1;
- };
- std::istream& operator>>(std::istream& input, Edge& p) {
- input >> p.from >> p.to >> p.risk;
- --p.from;
- --p.to;
- p.risk /= 100;
- 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), visited(n, false), color(n, 0),
- top_sort(n, 0), top_sort_pos(n - 1), d(n, INF) {};
- Graph(size_t n, EdgeVec& edges) : size(n), visited(n, false), color(n, 0),
- top_sort(n, 0), top_sort_pos(n - 1), d(n, INF), matrix(n, DoubleVec(n, 1)), neighbours(n) {
- for (auto edge : edges) {
- matrix[edge.from][edge.to] = edge.risk;
- matrix[edge.to][edge.from] = edge.risk;
- neighbours[edge.from].push_back(edge.to);
- neighbours[edge.to].push_back(edge.from);
- }
- for (size_t v = 0; v < n; ++v) {
- matrix[v][v] = 0;
- }
- };
- size_t size = 0;
- bool cycle = false;
- VecDoubleVec matrix;
- VecNumsVec neighbours;
- BoolVec visited;
- NumsVec color;
- NumsVec top_sort;
- NumsVec d;
- size_t top_sort_pos = 0;
- };
- void Floyd(Graph& g) {
- for (size_t k = 0; k < g.size; ++k) {
- for (size_t u = 0; u < g.size; ++u) {
- for (size_t v = 0; v < g.size; ++v) {
- g.matrix[u][v] = std::min(g.matrix[u][v], 1 - (1 - g.matrix[u][k]) * (1 - g.matrix[k][v]));
- }
- }
- }
- }
- int main() {
- size_t n, m, s, t;
- std::cin >> n >> m >> s >> t;
- EdgeVec edges(m);
- InputEdges(edges);
- Graph g(n, edges);
- Floyd(g);
- std::cout << g.matrix[s - 1][t - 1];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement