競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 401E問題

 

問題概要

ABC401E

解法

最初に判定問題を考える. \(1, \cdots , k\) 以外の頂点を全て消したとき,接続されていることが必要十分. これは, \(k\) について昇順に頂点を追加していき,小さい番号に向かう辺だけ追加すれば, 頂点 \(1, \cdots, k\) からなる fullsubgraph が作れる.

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

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


  vector<bool> connected(n); ll cc_vx_cnt = 0;
  rep(cu,n){
    for(auto ne: to[cu]){
      if(cu > ne) {
        uf.merge(cu,ne); // 判定
      }
      if(cu < ne){
        if(connected[ne]) continue;
        connected[ne] = true;
        cc_vx_cnt++;
      }
    }
    if(connected[cu]) cc_vx_cnt--;

    ll ans;
    if(uf.size(cu) != cu + 1){ // 判定
      ans = -1;
    }else{
      ans = cc_vx_cnt;
    }
    cout << ans << "\n";
  }


  return 0;
}