题意:
思路:并查集模板题。
代码:
#include <cstdio> #include <algorithm> using namespace std; const int maxn=10005; int father[maxn]; int birdSet[maxn]={0}; void Init() { for(int i=1;i<maxn;i++) father[i]=i; } int FindSet(int a) { int root=a; while(father[root]!=root) root=father[root]; //剪枝,(不剪枝会超时哦) while(father[a]!=a){ int tmp=a; a=father[a]; father[tmp]=root; } return root; } void Union(int a,int b) { int seta=FindSet(a); int setb=FindSet(b); if(seta!=setb) father[setb]=seta; } int main() { //freopen("pat.txt","r",stdin); Init(); int n,m,pre,curr; int birdCnt=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&m,&pre); if(pre>birdCnt) birdCnt=pre; for(int j=1;j<m;j++){ scanf("%d",&curr); if(curr>birdCnt) birdCnt=curr; Union(pre,curr); pre=curr; } } for(int i=1;i<=birdCnt;i++) birdSet[FindSet(i)]++; int setCnt=0; for(int i=1;i<=birdCnt;i++) if(birdSet[i]!=0) setCnt++; printf("%d %d\n",setCnt,birdCnt); int query,a,b; scanf("%d",&query); for(int i=0;i<query;i++){ scanf("%d%d",&a,&b); if(FindSet(a)==FindSet(b)) printf("Yes\n"); else printf("No\n"); } return 0; }