Description
在图书馆借阅同本书籍的学生表示有共同的爱好,可以成为好书友,好友的好友们也能成为好友。已知:一本书可能被多个学生借阅过,一个学生也可以借阅多本书。现有N个学生,编号0 - N-1,并且有M本书的借阅记录,那么有几个同学能够和编号0的同学成为好书友?
Input
第一行输入两个正整数N,M (1<= N,M <= 1000),N表示学生总数,M表示书籍总数
接下来有M行,每行是一本书籍的借阅记录,每行开头是一个整数K,表示该书被K人借阅过,后面有K个整数,每个整数表示借阅过的学生编号
Output
输出一个整数表示0号学生潜在的好书友数
Sample Input
10 3
3 1 2 0
4 3 2 5 7
2 9 8
Sample Output
5
#include <cstdio>
int n,m,a[1010];
bool b[1010],f[1010][1010];
void dfs(int x){
for (int i=1;i<n;i++)
if (f[x][i] && !b[i]){
b[i]=1;
dfs(i);
}
return ;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++){
int k;scanf("%d",&k);
for (int j=1;j<=k;j++)
scanf("%d",&a[j]);
for (int j0=1;j0<=k;j0++)
for (int j1=1;j1<=k;j1++)
if (j0 != j1)
f[a[j0]][a[j1]]=1;
}
b[0]=1;dfs(0);
int ans=0;
for (int i=1;i<n;i++)
if (b[i]) ans++;
printf("%d\n",ans);
return 0;
}
还有很多可以优化的地方,见谅