1076. Forwards on Weibo (30)
关键是读懂题目,然后用图的广度遍历即可。
比如sample里的
7 3 3 2 3 4 0 2 5 6 2 3 1 2 3 4 1 4 1 5 2 2 6用户1关注了3个人:2 3 4,因此可以转发2,3, 4的微博。
#include <stdio.h>
#define N 1001
void BFS(int path[][N], int n, int s, int deep, int *e);
int main()
{
int followers[N][N];
int n, l;
int m, i, j, k;
int each[N]; // every users's followers in deep l
scanf("%d %d", &n, &l);
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
followers[i][j] = 0;
}
}
// get each user's followers
for (i = 1; i <= n; ++i)
{
scanf("%d", &m);
for (j = 0; j < m; ++j)
{
scanf("%d", &k);
followers[k][i] = 1; // i follows k, so i can foward k's message
}
}
for (i = 1; i <= n; ++i)
{
BFS(followers, n, i, l, each);
}
scanf("%d", &m);
for (j = 0; j < m; ++j)
{
scanf("%d", &k);
printf("%d\n", each[k]);
}
return 0;
}
void BFS(int path[][N], int n, int s, int deep, int *e)
{
int visited[N];
int queue[N];
int front = 0, rear = 1;
int prerear;
int i, j, k;
int level = 1;
int count = 0;
for (i = 1; i <= n; ++i)
{
visited[i] = 0;
}
visited[s] = 1;
queue[front] = s;
while(front < rear)
{
prerear = rear;
++ level;
while(front < prerear)
{
j = queue[front++];
for (k = 1; k <= n; ++k)
{
if (visited[k] == 0 && path[j][k])
{
visited[k] = 1;
++ count;
queue[rear++] = k;
}
}
}
if (level > deep)
break;
}
e[s] = count;
}