洛谷 題解 P1551 親戚

2021-09-22 18:43:15 字數 1313 閱讀 5193

第一次發題解

題意大概是這樣的:

先給出三個數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...