#include <vector>

struct Solution {
    using edges_t = std::vector<std::vector<int>>;

    bool validPath(int n, const edges_t &edges, int source, int destination) {
        std::vector<bool> visited(n);
        visited[source] = true;

        bool changed;
        do {
            changed = iterate(edges, visited);
        } while (changed && !visited[destination]);

        return visited[destination];
    }

  private:
    bool iterate(const edges_t &edges, std::vector<bool> &visited) {
        bool changed = false;

        for (const auto &edge : edges) {
            auto [u, v] = std::tie(edge[0], edge[1]);
            if (visited[u] == visited[v]) {
                continue;
            }

            visited[u] = true;
            visited[v] = true;
            changed = true;
        }

        return changed;
    }
};