クラスカル法.
与えられた辺が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;
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;
}