처음에 간선들을 DSU로 이어서 $x_i, y_i$가 같은 컴포넌트에 있는게 있다면 불가능하다.
그렇지 않다면 $p_i, q_i$ 가 쿼리로 들어왔을 때 $p_i, q_i$ 의 컴포넌트끼리 이어지게 되는 것인데, 그럼 두 컴포넌트 사이에 $(x_i, y_i)$ 쌍이 있는지 set 같은걸로 확인한다.
컴포넌트를 나타내는 노드 번호는 DSU에서 각 트리의 루트 번호로 다루면 쉽다.
structDSU{vector<int>p;DSU(intn):p(n,-1){}intgp(intn){if(p[n]<0)returnn;returnp[n]=gp(p[n]);}voidmerge(inta,intb,intto_b=0){a=gp(a),b=gp(b);if(a==b)return;if(!to_b&&size(a)>size(b))swap(a,b);p[b]+=p[a];p[a]=b;}boolis_merged(inta,intb){returngp(a)==gp(b);}intsize(intn){return-p[gp(n)];}};voidsolve(){intn,m,k,q;cin>>n>>m;DSUdsu(n);vviedges(n);for(inti=0,u,v;i<m;i++){cin>>u>>v,u--,v--,edges[u].pb(v),edges[v].pb(u);dsu.merge(u,v);}cin>>k;vector<pi>xy(k);for(auto&[x,y]:xy)cin>>x>>y,x--,y--;cin>>q;// p, q 를 이어도 모든 xy에 대해 여전히 떨어져있을 수 있는가?// 처음에 xy 중 붙어있는게있으면 불가능하다.// 처음에는 모두 컴포넌트로 분리되어 있을 것이다.// p가 속한 컴포넌트와 q가 속한 컴포넌트가 이어졌을 때, 어떤 x[i], y[i]가 존재해 하나는 P에 하나는 Q에 있지 않으면 된다.// 컴포넌트별로 번호를 붙이고 (c1, c2) 같은 쌍들을 모두 모은다.intok=1;for(inti=0;i<k;i++){if(dsu.is_merged(xy[i].fi,xy[i].se))ok=0;}vector<set<int>>have(n);for(auto&[x,y]:xy){x=dsu.gp(x);y=dsu.gp(y);have[x].insert(y);have[y].insert(x);}while(q--){intp,q;cin>>p>>q,p--,q--;if(!ok){cout<<"No\n";continue;}if(dsu.is_merged(p,q)){cout<<"Yes\n";continue;}p=dsu.gp(p);q=dsu.gp(q);if(hass(have[p],q))cout<<"No\n";elsecout<<"Yes\n";}}
Comments