题目来源:PAT A1076 Forwards on Weibo
广度优先搜索
- 广度优先搜索以"广度"作为关键字,每次以扩展的方式向外访问结点。
- 遍历图时,需要使用一个队列,通过反复取出队首顶点,将该顶点可到达的未曾加入过队列的顶点全部入队,直到队列为空时遍历结束。
#include <bits/stdc++.h>
using namespace std;
int n, l; //用户数量,转发层数上限
const int N = 1010;
bool vis[N] = {false}; //标记是否被访问
struct node
{
int v; //顶点编号
int layer; //顶点层号
};
vector<node> Adj[N];
int BFS(int s, int L)
{
int ans = -1;
queue<node> q;
node start;
start.v = s;
start.layer = 0;
q.push(start);
vis[s] = true;
while (!q.empty())
{
node top = q.front();
q.pop();
ans++;
int u = top.v;
for (unsigned int i = 0; i < Adj[u].size(); i++)
{
node next = Adj[u][i];
next.layer = top.layer + 1;
if (!vis[next.v] && next.layer <= L)
{
q.push(next);
vis[next.v] = true;
}
}
}
return ans;
}
int main()
{
cin >> n >> l;
int num, nei;
node user;
for (int i = 1; i <= n; i++)
{
cin >> num;
user.v = i; //用户编号为i
for (int j = 0; j < num; j++)
{
cin >> nei;
Adj[nei].push_back(user);
}
}
int numQ; //查询个数
cin >> numQ;
int s; //起始结点编号
for (int i = 0; i < numQ; i++)
{
cin >> s;
int res = BFS(s, l);
memset(vis, false, sizeof(vis));
res = BFS(s, l);
cout << res << endl;
}
return 0;
}