/**

  • struct Point {
  • int x;
  • int y;
  • Point(int xx, int yy) : x(xx), y(yy) {}
  • };
  • /
    class Solution {
    public:
    /**
    • 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    • 能回到1号点返回 Yes,否则返回 No
    • @param param int整型vector param[0] 为 n,param[1] 为 m
    • @param edge Point类vector Point.x , Point.y 分别为一条边的两个点
    • @return string字符串
    • /
      struct hashFunc {
      size_t operator()(const pair<int,int> &o) const {
        return hash<int>()(o.first)^hash<int>()(o.second);
      }
      };
      vector<vector<int>> AL;
      unordered_set<pair<int,int>,hashFunc> vis;
      bool ans;
      int counter;
      void dfs(int u) {
      if (ans) return;
      int a,b;
      for (const auto &v : AL[u]) {
        a = u;
        b = v;
        if (a>b) swap(a,b);
        if (vis.find({a,b}) == vis.end()) {
            if (a == 1 || b == 1) {
                ++counter;
                if (counter > 1) {
                    ans = true;
                    return;
                }
            }
            vis.insert({a,b});
            dfs(v);
        }
      }
      }
      string solve(vector<int>& param, vector<point>& edge) {
      // write code here
      int n = param[0];
      vector<vector<int>>().swap(AL);
      AL.resize(n+1);
      vis.clear();
      for (const auto &i : edge) {
        AL[i.x].emplace_back(i.y);
        AL[i.y].emplace_back(i.x);
      }
      ans = false;
      counter = 0;
      dfs(1);
      return ans ? "Yes" : "No";
      }
      };</int></point></int></int>