爆刷PAT(甲級)——之【1118】 Birds in Forest(25 分)
阿新 • • 發佈:2018-12-13
補發一遍。
題意:好幾張圖畫,每張圖畫上面的鳥,都在一棵樹上。給你好幾幅圖的鳥,根據詢問回答兩隻鳥在不在一顆樹上。
難點:並查集,還是裸的並查集,直接跑就行了。
Code:
#include<bits/stdc++.h> using namespace std; #define inf 10009 #define INF 0x3f3f3f3f int father[inf]; void init() { for(int i=1;i<inf;i++)father[i]=i; } int findfather(int i) { if(father[i]==i)return i; return father[i]=findfather(father[i]); } void mergefather(int i,int j) { int x=findfather(i); int y=findfather(j); if(x!=y) father[x]=y; } int main() { init(); int i,j; int n,m,a,b; int maxNum=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&m,&a); if(a>maxNum)maxNum=a; for(j=1;j<m;j++) { scanf("%d",&b); if(b>maxNum)maxNum=b; mergefather(a,b); } } int sum=0; for(i=1;i<=maxNum;i++) if(father[i]==i)sum++; printf("%d %d\n",sum,maxNum); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a,&b); if(findfather(a)==findfather(b))printf("Yes\n"); else printf("No\n"); } return 0; }