競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 235E

ABC235E

クラスカル法.

与えられた辺がMSTに含まれるか判定する問題. まず,MSTを構築するアルゴリズムをベースに考える.

クラスカル法では,コストが小さい辺から使っていく. 辺 \(e : a \rightarrow b\) を追加するかどうかは, \(a,b\) が既に同じ connected component に属していれば追加しない, そうでなければ追加する,と判定できる.
今回のクエリも同様に処理できる. 最初から与えられた辺と,クエリで調べる辺を区別できる様にしておく. あとは,これらの辺を合わせた \(M + Q\) 本の辺に対して クラスカル法を使えばよい. それにより,クエリの辺を使うか判定出来る.

実装: クエリで調べる辺は,判定するだけで実際にMST を構成する時には使わない.

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

int main() {
  ll n, m , q;
  cin >> n >> m >> q;
  vector<tuple<ll,ll,ll,ll>> ed(m);
  rep(i,m){
    ll a,b,c; cin >> a >> b >> c;
    --a, --b;
    ed[i] = {c,a,b,-1};
  }

  rep(qi,q){
    ll a,b,c; cin >> a >> b >> c;
    --a,--b;
    ed.push_back({c,a,b,qi});
  }
  sort(all(ed));

  UnionFind<ll> uf(n);
  vll ans(q,-1);
  for(auto [c,a,b,i]: ed){
    if(i == -1){
      if(!uf.same(a,b)) uf.merge(a,b);
    }else{
      ans[i] = !uf.same(a,b);
    }
  }

  for(auto i:ans) yesno(i);


  return 0;
}