#include <vector>
#include <string>
#include <stdexcept>
#include <iostream>
#include <queue>
#include <set>

class Friend
{
public:
    std::vector<Friend*> friends;

    Friend(std::string email)
    {
        this->email = email;
    }
    
    void addFriendship(Friend* target)
    {
        friends.push_back(target);
        target->friends.push_back(this);
    }
    
    bool canBeConnected(Friend* target)
    {
        // throw std::logic_error("Waiting to be implemented");
        std::queue<Friend*> friendQueue;
        std::set<Friend*> vis;
        friendQueue.push(this);
        while (!friendQueue.empty()) {
            Friend* cur = friendQueue.front();
            friendQueue.pop();
            vis.insert(cur);
            if (target == cur) return true;
            for (Friend* directFriend : cur->friends) {
                if (vis.find(directFriend) == vis.end()) {
                    friendQueue.push(directFriend);
                }
            }
        }
        return false;


    }

private:
    std::string email;
};

#ifndef RunTests
int main()
{
    Friend a("A");
    Friend b("B");
    Friend c("C");
    
    a.addFriendship(&b);
    b.addFriendship(&c);
    
    std::cout << a.canBeConnected(&c);
}
#endif