天梯赛 L3-003. 社交集群

并查集,以人为节点,用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\n",con);
79     for(int i = 1; i < con; i++)
80         printf("%d ",ans[i]);
81     printf("%d\n",ans[con]);
82     return 0;
83 }

 

posted @ 2018-03-15 22:46  Xycdada  阅读(162)  评论(0编辑  收藏  举报