题目如下:

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:

Each input file contains one test case. For each case, the first line contains 2 positive integers: N (<=1000), the number of users; and L (<=6), the number of levels of indirect followers that are counted. Hence it is assumed that all the users are numbered
from 1 to N. Then N lines follow, each in the format:

M[i] user_list[i]

where M[i] (<=100) is the total number of people that user[i] follows; and user_list[i] is a list of the M[i] users that are followed by user[i]. It is guaranteed that no one can follow oneself. All the numbers are separated
by a space.

Then finally a positive K is given, followed by K UserID's for query.

Output Specification:

For each UserID, you are supposed to print in one line the maximum potential amount of forwards this user can triger, assuming that everyone who can view the initial post will forward it once, and that only L levels of indirect followers are
counted.

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

题目要求根据微博的关注链条计算一条微博可能被转发的最大次数,此题目考察的就是BFS的改进,最关键的是粉丝会看到关注人的微博,题目给出的是一个人的关注列表,因此这个图应该反向去存,例如1的关注有2、3、4,那么2、3、4应该有邻接点1,这是因为1关注了2、3、4,后三者的微博可以被1看到。

为了在BFS时知道当前的层,我们要定义level、tail、last三个变量,tail记录每次邻接点遍历时的结点号,last代表当前层的最后一个元素,如果出队元素v恰好为last,就说明应该进入下一层,并且tail最后存储的是v的最后一个邻接点,也就是下一层的最后一个元素,这时候更新last为tail,进入下一层。很显然last的初值应该为源点,这样才能在源点访问结束后顺利进入第二层。

最后,因为源点算一层,因此应该根据层数,对1≤level≤maxLevel的所有结点v进行记录,最后输出。

代码如下:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue> using namespace std; vector<vector<int> > graph;
vector<int> visited;
int N,M;
int maxLevel;
int K,num; int BFS(int source){
for(int i = 0; i <= N; i++)
visited[i] = false;
queue<int> q;
q.push(source);
int level = 0, last = source, tail = source;
visited[source] = true;
int cnt = 0;
while(!q.empty()){
int v = q.front();
q.pop();
for(int i = 0; i < graph[v].size(); i++){
int w = graph[v][i];
if(visited[w]) continue;
q.push(w);
tail = w;
visited[w] = true;
}
if(level >= 1 && level <= maxLevel){
cnt++;
}
if(v == last){
level ++;
last = tail;
} if(level > maxLevel) break;
} return cnt; } int main()
{
cin >> N >> maxLevel;
graph.resize(N + 1);
visited.resize(N + 1);
for(int i = 1; i <= N; i++){
scanf("%d",&M);
for(int j = 0; j < M; j++){
scanf("%d",&num);
graph[num].push_back(i);
}
}
cin >> K;
for(int i = 0; i < K; i++){
scanf("%d",&num);
cout << BFS(num) << endl;
} return 0;
}

1076. Forwards on Weibo (30) - 记录层的BFS改进的更多相关文章

  1. PAT 甲级 1076 Forwards on Weibo (30分)(bfs较简单)

    1076 Forwards on Weibo (30分)   Weibo is known as the Chinese version of Twitter. One user on Weibo m ...

  2. 1076. Forwards on Weibo (30)【树+搜索】——PAT (Advanced Level) Practise

    题目信息 1076. Forwards on Weibo (30) 时间限制3000 ms 内存限制65536 kB 代码长度限制16000 B Weibo is known as the Chine ...

  3. 1079. Total Sales of Supply Chain (25) -记录层的BFS改进

    题目如下: A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyon ...

  4. 1076 Forwards on Weibo (30)(30 分)

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  5. PAT Advanced 1076 Forwards on Weibo (30) [图的遍历,BFS,DFS]

    题目 Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and ...

  6. 1076. Forwards on Weibo (30)

    时间限制 3000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Weibo is known as the Chinese v ...

  7. PAT 1076. Forwards on Weibo (30)

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  8. PAT甲题题解-1076. Forwards on Weibo (30)-BFS

    题目大意:给出每个用户id关注的人,和转发最多的层数L,求一个id发了条微博最多会有多少个人转发,每个人只考虑转发一次.用BFS,同时每个节点要记录下所在的层数,由于只能转发一次,所以每个节点要用vi ...

  9. 【PAT甲级】1076 Forwards on Weibo (30 分)

    题意: 输入两个正整数N和L(N<=1000,L<=6),接着输入N行数据每行包括它关注人数(<=100)和关注的人的序号,接着输入一行包含一个正整数K和K个序号.输出每次询问的人发 ...

随机推荐

  1. CSAPP-程序优化

    代码移动: 如果一个表达式总是得到同样的结果,最好把它移动到循环外面,这样只需要计算一次.编译器有时候可以自动完成,比如说使用 -O1 优化.一个例子: void set_row(double *a, ...

  2. RAC基本原理

    RAC基本原理 什么是RAC? 多个实例跑在多个服务器上 一个数据库存放在共享的存储上,所有实例都可以访问 实例之间通过内联网络交换数据和信息 共享存储内容:数据文件.REDO.UNDO.控制文件 参 ...

  3. Java8的重要新特性

    一.Lambda表达式 java8中Lambda表达式的书写方式: (参数) -> 表达式 (参数) -> 单行语句 (参数) -> { 语句 } 1.Lambda遍历List和Ma ...

  4. 关于mysql初始化以及安全策略无法修改的问题

    通过mysql官方的yum源来安装的mysql-community-server ,这里版本是MySQL 8.0. wget  rpm -ivh  mysql80-community-release- ...

  5. spring基本原理

    作者:王奕然链接:https://www.zhihu.com/question/21346206/answer/101789659来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. Genymotion配置遇到的坑

    1.Genymotion 无法Add下来 解决: ①首先打开Genymotion,的Settings然后找到VirtualBox,复制链接,在本地找到文件夹,然后返回上一层找到ova文件夹进入, ②然 ...

  7. zookeeper工作机制

    Zookeeper Zookeeper概念简介: Zookeeper是为用户的分布式应用程序提供协调服务的 zookeeper是为别的分布式程序服务的 Zookeeper本身就是一个分布式程序(只要有 ...

  8. Microsoft Visual Studio 2017 编译最新版 libuv 1.x

    步骤很简单 1 下载最新版的 libuv(地址:https://github.com/libuv 2 安装Git,Python 2.7 ,cmake(这里使用的是 3.11.0-win64-x64 版 ...

  9. 原生js去掉所有的html标签,最终得到HTML标签中的所有内容

    替换掉所有的 html标签,最终得到Html标签中的内容 <script> //替换掉所有的 html标签,最终得到Html标签中的内容 var req="<div sty ...

  10. tomcat连接池配置和使用

    一种方法是在conf/context.xml文件中配置,配置oracle连接池的一个例子的context内容如下: <?xml version='1.0' encoding='utf-8'?&g ...