題目引用自洛谷。
若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定:x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。第一行:三個整數n,m,p,(n<=5000,m<=5000,p<=5000),分別表示有n個人,m個親戚關係,詢問p對親戚關係。
以下m行:每行兩個數Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有親戚關係。
接下來p行:每行兩個數Pi,Pj,詢問Pi和Pj是否具有親戚關係。
輸出P行,每行一個’Yes’或’No’。表示第i個詢問的答案爲“具有”或“不具有”親戚關係。 這是一道非常簡單的並查集題目。沒有實際考察價值僅僅用於並查集的入門:
我在這裏提供的代碼都使用了類封裝,事實上這樣可能會常數級降低效率。
#include
#include
#include
#define UFS_LIMIT 10000
using namespace std;
class UnionFindSet
{
public:
int father[UFS_LIMIT];
UnionFindSet()
{
for(int i=0;i>n>>m>>p;
for(i=0;i>t1>>t2, ufs.Union(t1,t2);
for(i=0;i
>t1>>t2, cout<<(ufs.IfSame(t1,t2)?"Yes":"No")<