L3-003 Cluster social (30 points): recherche simultanée

Lorsque vous vous inscrivez sur une plateforme de réseau social, il vous est généralement demandé de renseigner vos intérêts personnels afin de trouver des amis potentiels ayant les mêmes passe-temps. Un «groupe social» fait référence à un ensemble de personnes partageant les mêmes intérêts. Vous devez trouver tous les clusters sociaux.

Format d'entrée:
saisissez le nombre de tous les utilisateurs enregistrés sur la plate-forme de réseau social, avec un entier positif N (≤1000) sur la première ligne. Donc, ces personnes sont numérotées de 1 à N. Les N lignes suivantes, chaque ligne donne une liste des passe-temps d’une personne au format suivant:
K i: h i [1] h i [2]… h i [K i ] Où K i (> 0) est le nombre de passe-temps, hi i [j] est le numéro du j-ème passe-temps, qui est un entier dans l'intervalle [1, 1000].

Format de sortie:
affichez d'abord le nombre de clusters sociaux différents sur une ligne. Ensuite, la deuxième ligne affiche le nombre de personnes dans chaque cluster dans un ordre non croissant. Les nombres sont séparés par un espace et aucun espace supplémentaire n'est autorisé à la fin de la ligne.

Exemple d'entrée:
8
3: 2 7 10
1: 4
2: 5 3
1: 4
1: 3
1: 4
4: 6 8 1 5
1: 4
Exemple de sortie:
3
4 3 1

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int x[1010],fa[1010],ans[1010],sum=0,n,k,t;
string s;
int fin(int x)
{
    
    
	if(fa[x]==x) return x;
	return fa[x]=fin(fa[x]);
}
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
     fa[i]=i;
    for(int i=1;i<=n;i++)
    {
    
    
    	cin>>s;
    	k=0;
    	for(int j=0;j<s.length()-1;j++)
    	 k=k*10+s[j]-'0';
    	while(k--)
    	{
    
    
    		cin>>t;
    		if(x[t]==0) x[t]=i;
    		else 
			{
    
    
			 fa[fin(x[t])]=i;	
			 //cout<<x[t]<<" "<<fa[x[t]]<<endl;
			 x[t]=i;
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
    
    
	 ans[fin(i)]++;
	 if(ans[fin(i)]==1) sum++;	
    } 
	sort(ans+1,ans+n+1);
	cout<<sum<<endl;
	cout<<ans[n];
	for(int i=n-1,j=sum-1;i&&j;i--,j--)
	 cout<<" "<<ans[i];
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43540515/article/details/110219893
conseillé
Classement