競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 292D

ABC292D

DFSして数える.
dfs(cu){
 頂点に入るときの処理
  for(ne in to[cu]){
   次の頂点に遷移する辺に関する処理    dfs(ne)
  前の頂点に戻るときの辺に関する処理  }
 頂点から出るときの処理
}
が基本形.
あとは,ループや多重辺に注意.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll n,m; cin >> n >> m;
  vvll to(n);
  rep(i,m){
    ll a, b; cin >> a >> b;
    --a, --b;
    to[a].push_back(b);
    to[b].push_back(a);
  }

  vll vis(n);
  ll cv = 0, ce = 0;
  auto dfs = [&](auto f, ll cu, ll pa = -1) -> void {
    if(vis[cu]){
      return ;
    }
    vis[cu] = true;
    cv ++;
    for(auto ne: to[cu]){// if(ne != pa){
      ce++;
      f(f, ne, cu);
    }
  };


  rep(i,n) if(!vis[i]){
    cv = 0;
    ce = 0;
    dfs(dfs, i);
    if(cv != ce/2){
      cout << "No" << endl;
      return 0;
    }
  }
 
  cout << "Yes" << endl;

  return 0;
}