首页 > 其他 > 详细

天梯赛 L3-003. 社交集群

时间:2018-03-15 23:34:10      阅读:289      评论:0      收藏:0      [点我收藏+]

并查集,以人为节点,用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. 社交集群

原文:https://www.cnblogs.com/Xycdada/p/8576942.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!