大概题意就是每个人会一些语言,为了保证可以让全公司舒畅沟通要每个人再学的语言的总和
我的解法是把可以互相沟通的人视为一个群体,群体总数是n;最好得n-1是答案;没有考虑一门也不会的人无论如何都要学一门;一直没过很烦;
#include<iostream>
using namespace std;
bool a[101][101];
bool c[101][101];
bool b[101];
void dp(int x,int n)
{
for(int i=0;i<n;i++)
{
if(c[i][x]&&!b[i])
{
b[x]=1;
dp(i,n);
}
}
}
int main() {
int flag=0;
int n,m,i,j,k,t, cnt=0,r=0;
cin>>n>>m;
for(i=0; i<n; i++) {
cin>>t;
int x;
if(t==0)r++,b[i]=1;//一个语言也没学的人自动入群
else flag=1;//至少有一个群体了,区别于每个人都不会的
while(t--) {
cin>>x;
a[i][x]=1;
}
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
for(k=1; k<=m; k++) {
if(a[i][k]&&a[j][k]) {
c[i][j]=1;
}
}
}
}//cij表示i和J互相认识
for(i=0; i<n; i++) {
if(!b[i]) {
cnt++;
b[i]=1;
dp(i,n);
}
}//递归算
printf("%d",cnt+r-flag);
}