洛谷p1551
若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。
規定: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,表示mi和mj具有親戚關係。
接下來p行:每行兩個數pi,pj,詢問pi和pj是否具有親戚關係。
輸出
p行,每行乙個』yes』或』no』。表示第i個詢問的答案為「具有」或「不具有」親戚關係。
這道題的作者已提示需要用並查集。
基本思路就是將兩個有關係的點聯絡起來,後面的管前面的叫爸爸,在通過查詢爸爸是否相同來判斷是否有親戚關係。
#include
#include
using
namespace std;
int n,m,q,f[
10100
],x,y,fx,fy;
//人數n關係數m查詢數q 爸爸陣列f以及幾個臨時變數
bool ans[
5001];
intgetfa
(int num)
//爸爸是自己就返回
f[num]
=getfa
(f[num]);
//爸爸不是自己就直接把祖宗認為爸爸 壓縮路徑
return f[num];}
intmain()
//將所有數的爸爸設為自己 即和別人沒有關係
for(
int i=
1;i<=m;i++
)for
(int i=
1;i<=q;i++)if
(fx!=fy)
}for
(int i=
1;i<=q;i++
)else
}return0;
}
神奇的並查集。 洛谷 題解 P1551 親戚
第一次發題解 題意大概是這樣的 先給出三個數n,m,p,一共1 n個人,給定m組親戚的關係 a,b 例如1和2是親戚,1和3又是親戚,那麼2和3也是親戚。最後給出p對人,問他們是不是親戚,而親戚的親戚也是親戚,所以此題用到並查集,合併題目中已知的親戚關係。include include includ...
洛谷 P1551 親戚
題目背景 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。題目描述 規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。輸入格式 第一行 三個整數n,m,p...
洛谷 P1551 親戚
洛谷 p1551 親戚 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。輸入格式 第一行 三個整數n,m...