\quad 首先找出兴趣相同的人,建立关系,vector v[maxn];其中v[i]中的值是与i有相同兴趣的人。最后dfs,标记每个人所属类别,统计每类人数,排序输出即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct People
{
int habbit[maxn];
}people[maxn];
vector<int> v[maxn];
int vis[maxn] = {0};
int temp[maxn];
int cnt[maxn] = {0};
vector<pair<int, int> > res;
bool cmp(const pair<int, int> &p1, const pair<int, int> &p2)
{
return p1.second>p2.second;
}
void dfs(int u, int id)
{
temp[u] = id;
vis[u] = 1;
for (int i = 0; i < v[u].size(); ++i)
{
if(vis[v[u][i]]==0) dfs(v[u][i], id);
}
return;
}
int main(int argc, char const *argv[])
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
int num;
scanf("%d: ", &num);
for (int j = 0; j < num; ++j)
{
int t;
scanf("%d", &t);
people[i].habbit[t] = 1;
}
}
for (int i = 0; i < n; ++i)
{
for (int j = i+1; j < n; ++j)
{
for (int k = 0; k < maxn; ++k)
{
if(people[i].habbit[k]==1 && people[j].habbit[k]==1)
{
v[i].push_back(j);
v[j].push_back(i);
}
}
}
}
int id = 0;
for (int i = 0; i < n; ++i)
{
if(vis[i]==0)
{
dfs(i, id);
id++;
}
}
for (int i = 0; i < n; ++i)
{
cnt[temp[i]]++;
}
for (int i = 0; i < n; ++i)
{
if(cnt[i]!=0) res.push_back(make_pair(i, cnt[i]));
}
sort(res.begin(), res.end(), cmp);
printf("%d\n", res.size());
for (int i = 0; i < res.size(); ++i)
{
if(i!=0) printf(" ");
printf("%d", res[i].second);
}
return 0;
}
\quad 用字典优化下,时间缩短了20倍。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
struct People
{
int habbit[maxn];
map<int, int> m;
}people[maxn];
vector<int> v[maxn];
int vis[maxn] = {0};
int temp[maxn];
int cnt[maxn] = {0};
vector<pair<int, int> > res;
bool cmp(const pair<int, int> &p1, const pair<int, int> &p2)
{
return p1.second>p2.second;
}
void dfs(int u, int id)
{
temp[u] = id;
vis[u] = 1;
for (int i = 0; i < v[u].size(); ++i)
{
if(vis[v[u][i]]==0) dfs(v[u][i], id);
}
return;
}
int main(int argc, char const *argv[])
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
int num;
scanf("%d: ", &num);
for (int j = 0; j < num; ++j)
{
int t;
scanf("%d", &t);
people[i].m[t] = 1;
}
}
map<int, int>::iterator it;
for (int i = 0; i < n; ++i)
{
for (int j = i+1; j < n; ++j)
{
for(it=people[i].m.begin(); it!=people[i].m.end(); it++)
{
if(people[j].m.count(it->first))
{
v[i].push_back(j);
v[j].push_back(i);
}
}
}
}
int id = 0;
for (int i = 0; i < n; ++i)
{
if(vis[i]==0)
{
dfs(i, id);
id++;
}
}
for (int i = 0; i < n; ++i)
{
cnt[temp[i]]++;
}
for (int i = 0; i < n; ++i)
{
if(cnt[i]!=0) res.push_back(make_pair(i, cnt[i]));
}
sort(res.begin(), res.end(), cmp);
printf("%d\n", res.size());
for (int i = 0; i < res.size(); ++i)
{
if(i!=0) printf(" ");
printf("%d", res[i].second);
}
return 0;
}