并查集,以人为节点,用set来存每个人的兴趣,输入第i个人的兴趣时,如果在前i个人的兴趣里找得到,就将两个人合并。
1 #include<iostream> 2 #include<string> 3 #include<stdio.h> 4 #include<string.h> 5 #include<algorithm> 6 #include<set> 7 #include<queue> 8 #include<map> 9 #include<vector> 10 #define MAX_N 1005 11 #define ll long long 12 13 using namespace std; 14 15 int n; 16 int root[MAX_N]; 17 set<int> ss[MAX_N]; 18 int ans[MAX_N]; 19 void init() 20 { 21 for(int i = 0; i < MAX_N; i++) 22 root[i] = i,ans[i] = 1; 23 } 24 int findFather(int x) 25 { 26 if(root[x]==x) 27 return x; 28 return findFather(root[x]); 29 } 30 31 void merge(int x, int y) 32 { 33 int xx = findFather(x); 34 int yy = findFather(y); 35 36 if(xx!=yy) 37 { 38 root[yy] = xx; 39 ans[xx]+=ans[yy]; 40 ans[yy] = 0; 41 } 42 } 43 bool cmp(int a,int b) 44 { 45 return a>b; 46 } 47 int main() 48 { 49 init(); 50 scanf("%d",&n); 51 int k,temp; 52 for(int i = 1; i <= n; i++) 53 { 54 scanf("%d:",&k); 55 for(int j = 1; j <= k; j++) 56 { 57 scanf("%d",&temp); 58 ss[i].insert(temp); 59 for(int k = 1; k < i; k++) 60 { 61 if(ss[k].find(temp) != ss[k].end()) 62 { 63 merge(i,k); 64 } 65 } 66 } 67 } 68 sort(ans+1,ans+n+1,cmp); 69 70 int con = 0; 71 for(int i = 1; i <= n; i++) 72 { 73 if(ans[i]) 74 con++; 75 else 76 break; 77 } 78 printf("%d ",con); 79 for(int i = 1; i < con; i++) 80 printf("%d ",ans[i]); 81 printf("%d ",ans[con]); 82 return 0; 83 }