1107. Social Clusters

1107. Social Clusters (30)

时间限制
1000 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

When register on a social network, you are always asked to specify your hobbies in order to find some potential friends with the same hobbies. A "social cluster" is a set of people who have some of their hobbies in common. You are supposed to find all the clusters.

Input Specification:

Each input file contains one test case. For each test case, the first line contains a positive integer N (<=1000), the total number of people in a social network. Hence the people are numbered from 1 to N. Then N lines follow, each gives the hobby list of a person in the format:

Ki: hi[1] hi[2] ... hi[Ki]

where Ki (>0) is the number of hobbies, and hi[j] is the index of the j-th hobby, which is an integer in [1, 1000].

Output Specification:

For each case, print in one line the total number of clusters in the network. Then in the second line, print the numbers of people in the clusters in non-increasing order. The numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:
8
3: 2 7 10
1: 4
2: 5 3
1: 4
1: 3
1: 4
4: 6 8 1 5
1: 4
Sample Output:
3
4 3 1
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;

vector<int> par;
vector<int> count1;
vector<int> num;

int cnt;

struct node{
  vector<int> sNum;
};
vector<node> xq(1005);

int find(int x){
  if(x == par[x])
    return x;
  else return par[x] = find(par[x]);
}

bool cmp(int a,int b){
  return a>b;
}

void merge(int a,int b){
  int x = find(a);
  int y = find(b);
  if(x == y) return ;
  --cnt;
  if(count1[x]<count1[y]){
    par[x] = y;
    num[y] += num[x];
  }
  else if(count1[x]>count1[y]){
    par[y] = x;
    num[x] += num[y];
  }
  else{
    par[y] = x;
    num[x] += num[y];
    count1[x]++;
  } 
}

int main(){
  int n,a,m,max = 0;
  cin>>n;
  par.resize(n);
  num.resize(n);
  count1.resize(n);
  for(int i = 0;i<n;++i){
    par[i] = i;
    num[i] = 1;
  }
  cnt = n;
  for(int i = 0;i<n;++i){
    scanf("%d:",&m);
    for(int j = 0;j<m;++j){
      scanf("%d",&a);
      if(a>max) max = a;
      xq[a].sNum.push_back(i);
    }
  }
  
  for(int i = 0;i<=max;++i){
    if(xq[i].sNum.size() != 0){
      for(int j = 1;j<xq[i].sNum.size();++j)
        merge(xq[i].sNum[0],xq[i].sNum[j]);
    }
  }
  
  set<int> res;
  for(int i = 0;i<n;++i)
    res.insert(find(i));
    
  vector<int> res2;
  set<int>::iterator iter = res.begin();
  
  for(;iter != res.end();++iter)
    res2.push_back(num[find(*iter)]);
  
  cout<<cnt<<endl;
  sort(res2.begin(),res2.end(),cmp);
  cout<<res2[0];
  for(int i = 1;i<cnt;++i)
    cout<<" "<<res2[i];
  cout<<endl;
  return 0;
}


你可能感兴趣的:(1107. Social Clusters)