第一次發題解
題意大概是這樣的:
先給出三個數n,m,p,一共1…n個人,給定m組親戚的關係(a,b),例如1和2是親戚,1和3又是親戚,那麼2和3也是親戚。最後給出p對人,問他們是不是親戚,而親戚的親戚也是親戚,所以此題用到並查集,合併題目中已知的親戚關係。
#include#include#include#include#include#include#include//標頭檔案
using namespace std;
int n,m,p,a,b;
int c,d,f[500001];
void init()
}//賦值函式,先假定每個人的親戚都是自己
int getf(int k)
else }
//尋找函式,如果給定的a,b相同或者a,b有親戚關係,那麼返回出b的親戚就是a,把a賦值給b,方便後來判斷;
void merge(int x,int y)
return;
}//合併函式,將兩個親戚合併,相當於把b的親戚標上了a;
int main()
//輸入親戚關係,合併親戚關係
for(int i=1;i<=p;i++)
}
這是賦值的函式,假設一開始每個人都只有乙個親戚,那就是自己……
int getf(int k)
else
}
尋找親戚的函式,如果給定了兩個人是一樣的,那麼他們就都是自己的親戚,就返回出乙個值,如果不一樣,且不知道是不是親戚,那麼就繼續找出給定數的親戚,直到找到他最終的親戚,而在這個過程中,所有的被找過的數如果是最終親戚的親戚,那麼就把最終親戚的數賦值給過程中被找到的數,這樣最後判斷起來就十分方便……
void merge(int x,int y)
return;
}
這應該是最好理解的……給定兩個數,找出每個數的最終的親戚,如果不一樣,那麼把a的值賦給b,這樣也是方便判斷,如果一樣,那就不用合併了,直接退出……
int main()
for(int i=1;i<=p;i++)
{ cin>>c>>d;
c=getf(c);
d=getf(d);
if(c==d)
{ cout<<"yes"《主函式,不用說了吧%%%……%%%
輸入人數,親戚關係數,要判斷的親戚關係數,再先呼叫函式賦值,輸入親戚關係,合併,再輸入要判斷的,如果兩個數的最終親戚是一樣的,那麼就是親戚關係,否則就不是。
洛谷P1551親戚 題解
洛谷p1551 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,現在給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是親戚,那麼x和z也是親戚。如果x,y是親戚,那麼x的親戚都是y的親戚,y的親戚也都是x的親戚。輸入 第一行 三個整數n,m,p,n 5...
洛谷 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...