#include<bits/stdc++.h> using namespace std; const int MAXSIZE = 100001; int uset[MAXSIZE]; int Rank[MAXSIZE]; map<int,int> m; void makeSet(int size) {       for(int i = 0;i < size;i++)  uset[i] = i;     for(int i = 0;i < size;i++)  Rank[i] = 0; } int find(int x) {     if (x != uset[x]) uset[x] = find(uset[x]);     return uset[x]; } void unionSet(int x, int y) {     if ((x = find(x)) == (y = find(y))) return;     if (Rank[x] > Rank[y]) uset[y] = x;       else {           uset[x] = y;           if (Rank[x] == Rank[y]) Rank[y]++;       } } int main(){     int n;     makeSet(MAXSIZE);     cin>>n;      for(int i=1;i<=n;i++){         int t;         while(cin>>t){             if(t==0)             break;             unionSet(i,t);         }     }     int count = 0;     for(int i=1;i<=n;i++){         int t = find(i);         if(m[t]==0){             count++;             m[t]=1;         }     }     cout<<count; } 第一题,裸的并查集..就过了这一题
点赞 评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
程序员牛肉:这一眼假啊,基本上都是骗人的,不然就涉及到职位贪腐了,就像之前华为的OD事件,看你运气好不好了
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务