PAT甲级 1107 Social Clusters (30 分)

\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;
}

猜你喜欢

转载自blog.csdn.net/qq_40438165/article/details/90040692