题目如下:

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. POI ZAW

    要求一个最短路,担心的就是一条边被正反经过两次. 规定第一步为1到i,并把这条边设为不可经过.然后从i做最短路到1,因为这个过程是不会经历重边的(如果经历了就不是最短路了). 求最短路用SPFA,但常 ...

  2. 【BZOJ1835】【ZJOI2010】基站选址

    原题传送门 Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距 ...

  3. 【bzoj4567 scoi2016】 背单词

    题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ...

  4. [坑况]饿了么你是这样的前端——vue+element ui 【this dependency was not found:'element-ui/lib/theme-chalk/index.css'】

    element ui 坑况:今日pull代码,潇洒npm run dev ,被告知:this dependency was not found:'element-ui/lib/theme-chalk/ ...

  5. JavaBean toString方式

    package object; import java.util.Date; public class ReportDataQo implements java.io.Serializable { p ...

  6. Echarts 地图添加自定义区域

    使用 Echarts 生成地图时,如果需要添加一些自定义区域,该怎么做呢?请看下面示例. 生成原始地图 index.hmtl 引入 Jquery 和 Echart <!DOCTYPE html& ...

  7. JAVA学习总结-多线程基础:

    参考书籍:疯狂JAVA讲义 1.进程和线程; 进程是处于运行过程中的程序;并且具有一定的独立功能;进程是系统进行系统资源分配和调度的一个独立单位. 一般而言,进程包括以下三个特征: 独立性:进程是系统 ...

  8. easyui datagrid 排序问题

    $('#dg').datagrid({ remoteSort:false,④  sortName:'sysfield', ①  sortOrder:'desc',② columns:[[ {field ...

  9. 正则替换replace中$1的用法以及常用正则

    一.repalce定义 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replacement)参数一 ...

  10. NVIDIA Titan Xp Star Wars Collector's Edition显卡深度学习工作站 + Ubuntu17.10 + Tensorflow-gpu + Anaconda3 + Python 3.6 设置

    为了能让 Tensorflow GPU 版本跑起来,我折腾了1个多星期. 总体参照 https://zhuanlan.zhihu.com/p/32118549 ,安装成功,但还是有不足的地方, 在此记 ...