PAT甲级1076 Forwards on Weibo (30分)|C++实现

一、题目描述

原题链接
Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may follow many other users as well. Hence a social network is formed with followers relations. When a user makes a post on Weibo, all his/her followers can view and forward his/her post, which can then be forwarded again by their followers. Now given a social network, you are supposed to calculate the maximum potential amount of forwards for any specific user, assuming that only L levels of indirect followers are counted.

Input Specification:

在这里插入图片描述

​​Output Specification:

在这里插入图片描述

Sample Input:

7 3
3 2 3 4
0
2 5 6
2 3 1
2 3 4
1 4
1 5
2 2 6

Sample Output:

4
5

二、解题思路

给定起点,图的层序遍历题。注意题目这里给出的数据是一个用户follow的其他用户,而不是follow这个用户的人,所以在建立邻接表的时候,要注意一下。对于每个输入的query,我们进行一次层序遍历(用队列实现),将每个用户对应的层数存在level数组中,大于题目所要求的的L后,break即可。

三、AC代码

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 1010;
vector<vector<int> > Adj;
int main()
{
  int N, L, num, tmp, query;
  scanf("%d%d", &N, &L);
  Adj.resize(N+1);
  for(int i=1; i<=N; i++)
  {
    scanf("%d", &num);
    for(int j=0; j<num; j++)
    {
      scanf("%d", &tmp);
      Adj[tmp].push_back(i);
    }
  }
  scanf("%d", &num);
  for(int i=0; i<num; i++)
  {
    int cnt = 0, level[N+1];
    queue<int> q;
    bool inq[maxn] = {false};
    scanf("%d", &query);
    inq[query] = true;
    q.push(query);
    level[query] = 0;
    while(!q.empty())
    {
      tmp = q.front();
      q.pop();
      if(level[tmp] >= L)	break;
      for(int i=0; i<Adj[tmp].size(); i++)
      {
        if(!inq[Adj[tmp][i]])
        {
          q.push(Adj[tmp][i]);
          inq[Adj[tmp][i]] = true;
          level[Adj[tmp][i]] = level[tmp] + 1;
          cnt++;
        }
      }
    }
    printf("%d\n", cnt);
  }
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个AI语言模型,无法提供完整的编程实现。但我可以给您提供一些跳表类的模型的基本思路: 跳表是一种基于有序链表的数据结构,它通过将链表中的一些节点连接起来,形成多级索引,从而实现快速查找的目的。跳表中的每个节点包含一个值和一个指向下一个节点的指针,同时还包含若干个指向下一级索引节点的指针。 跳表的插入、删除、查找操作都比较简单,主要是通过多级索引快速定位到目标节点,然后再进行相应的操作。下面是一个跳表类的模型的基本框架: ```c typedef struct skip_node { int value; struct skip_node **forwards; } skip_node; typedef struct skip_list { int level; int max_level; skip_node *header; } skip_list; skip_node* create_node(int value, int level); skip_list* create_list(int max_level); void insert(skip_list *list, int value); void delete(skip_list *list, int value); skip_node* find(skip_list *list, int value); void print_list(skip_list *list); ``` 其中,skip_node表示跳表中的节点,skip_list表示跳表的头结点,包含了跳表的最大层数和当前的层数。create_node用于创建一个新节点,create_list用于创建一个新的跳表,insert用于向跳表中插入一个元素,delete用于从跳表中删除一个元素,find用于查找跳表中的一个元素,print_list用于输出跳表的所有元素。 具体的实现细节可以参考跳表的相关文献或者网上的代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值