天梯赛 L3-003. 社交集群

Posted Xycdada

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天梯赛 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 }

 

以上是关于天梯赛 L3-003. 社交集群的主要内容,如果未能解决你的问题,请参考以下文章

天梯L3-003. 社交集群——并查集

L3-003. 社交集群

L3-003. 社交集群

c++天梯赛L2-039 清点代码库 (25 分)天梯赛c++附详细注释

L1-027 出租 (20 分)天梯赛C++和python 代码

团体程序设计天梯赛 L3-019. 代码排版(测试数据+不同方法)