競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 311C

ABC311C

すべての頂点から \(1\) 本ずつ辺が出ているので, どの頂点から始めてもサイクルにたどり着く.
サイクルの検出は,訪れた頂点を記録しておいて, すでに訪れた頂点に再び来たときにサイクルがあると分かる.

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

int main() {
  ll n;
  cin >> n;
  vll to(n);
  // vll from(n);
  rep(i,n){
    ll a; cin >> a;
    a--;
    to[i] = a;
    // from[a] = i;
  }

  vll used(n);
  ll x = 0;
  while(!used[x]){
    used[x] = true;
    x = to[x];
  }

  vll v;
  used = vll(n);
  while(!used[x]){
    used[x] = true;
    v.push_back(x);
    x = to[x];
  }

  cout << v.size() << endl;
  for(auto i:v) cout << i+1 << " ";
 
  return 0;
}