亲戚 并查集
問(wèn)題描述
若某個(gè)家族人員過(guò)于龐大,要判斷兩個(gè)是否是親戚,確實(shí)還很不容易,現(xiàn)在給出某個(gè)親戚關(guān)系圖,求任意給出的兩個(gè)人是否具有親戚關(guān)系。 規(guī)定:x和y是親戚,y和z是親戚,那么x和z也是親戚。如果x,y是親戚,那么x的親戚都是y的親戚,y的親戚也都是x的親戚。
輸入文件
第一行:三個(gè)整數(shù)n,m,p,(n<=5000,m<=5000,p<=5000),分別表示有n個(gè)人,m個(gè)親戚關(guān)系,詢問(wèn)p對(duì)親戚關(guān)系。 以下m行:每行兩個(gè)數(shù)Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有親戚關(guān)系。 接下來(lái)p行:每行兩個(gè)數(shù)Pi,Pj,詢問(wèn)Pi和Pj是否具有親戚關(guān)系。
輸出格式
P行,每行一個(gè)’Yes’或’No’。表示第i個(gè)詢問(wèn)的答案為“具有”或“不具有”親戚關(guān)系。
樣例格式
6 5 3 1 2 1 5 3 4 5 2 1 3 1 4 2 3 5 6樣例輸出
Yes Yes No限制和約定
時(shí)間限制:1s
空間限制:128MB
#include<iostream> using namespace std; int f[50010],n,m,p; int find(int x) {if(x==f[x]) return x;else return f[x]=find(f[x]); } void merge(int x,int y) {int rx=find(x);int ry=find(y);if(rx!=ry) f[rx]=ry; } int main() {int a,b;cin>>n>>m>>p;for(int i=1;i<=n;i++)f[i]=i;for(int i=1;i<=m;i++){cin>>a>>b;merge(a,b);}for(int i=1;i<=p;i++){cin>>a>>b;if(find(a)==find(b)) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/hfang/p/11239987.html
總結(jié)