PAT 1076

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值