题目
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
题目大意
有k人分别有不同的爱好,找到爱好,找到有爱好交集的社交圈的个数以及对应得人数。
思路
可以先构建一个人员与爱好的映射表,然后通过DFS找到对应的社交圈。
先定义映射表为G,记录用户是否已经进入社交圈数组vis。
最主要的部分是如何找到社交圈里的人员。从第一个可访问的用户进入,找到该用户所有的爱好,再找出所有拥有该爱好的人,再对这部分进行上述操作。
void DFS(int n) {
vis[n] = true; num++;
//遍历n号用户所有的爱好
for (int i = 0; i < 1010; i++) {
if (G[n][i] == 1) {
//遍历所有i爱好的用户
for (int m = 0; m < 1010; m++) {
//m号用户有该爱好 且 没有进入社交圈
if (G[m][i] == 1 && vis[m] == false)
DFS(m);
}
}
}
}
代码
#include<bits/stdc++.h>
using namespace std;
int n;
int G[1010][1010];
bool vis[1010] = { false };
int num = 0;
vector<int> res;
void DFS(int n) {
vis[n] = true; num++;
for (int i = 0; i < 1010; i++) {
if (G[n][i] == 1) {
for (int m = 0; m < 1010; m++) {
if (G[m][i] == 1 && vis[m] == false)
DFS(m);
}
}
}
}
void tracert() {
for (int i = 0; i < n; i++) {
if (vis[i] == false) {
DFS(i);
res.push_back(num);
num = 0;
}
}
}
bool cmp(int a, int b) {
return a > b;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int t;
scanf("%d: ", &t);
for (int m = 0; m < t; m++) {
int q;
scanf("%d", &q);
G[i][q] = 1;
}
}
tracert();
cout << res.size() << endl;
sort(res.begin(), res.end(), cmp);
for (int i = 0; i < res.size(); i++) {
if (i != 0) cout << " ";
cout << res[i];
}
}