一道有向图论题
这道题之间在看晴神的《算法笔记》时做过,现在再做一遍吧,多熟练熟练
PAT甲级 1076 Forwards on Weibo (30分)
原题如下
这次直接用截图的方式附题,果然方便很多呢,也很清楚:
题目意思
微博中每个人的粉丝的粉丝可以认为是这个人的潜力粉丝,所以给出一个人关注了那些人(即他是这些人的粉丝),然后再给定需要求潜力粉丝的用户
i
d
(
1
−
N
)
id(1-N)
id(1−N),输出在
L
L
L层内这个用户的潜力粉丝人数。
输入:
用户人数
N
N
N 允许的层数
L
L
L
接下来N行输入每个用户的关注人的id,格式如下:
M[i] user_list[i]
最后给出要求的人数
k
k
k和这
k
k
k个人的
i
d
id
id
输出:
分别输出这k个人的潜藏粉丝数
自己的想法
- 由于 N ≤ 1000 N\leq1000 N≤1000,所以可以建立一个邻接矩阵当然也可以用 v e c t o r vector vector来构造这个有向图,令被关注者为有向边的源,其粉丝被有向边指向。
- 由于题目限制为层数,所以采用层序遍历BFS,令源点的 l a y e r layer layer为0,其潜在粉丝数为 s u m = 0 sum=0 sum=0,到下一层则 l a y e r + 1 layer+1 layer+1,遍历一个点则 s u m + + sum++ sum++直至 l a y e r > L layer>L layer>L则终止。
- 最后输出的潜在粉丝数为 s u m − 1 sum-1 sum−1,因为要减去自己本身。
答案反馈
一次AC啦~
因为忘了初始化导致卡了一下,这道题大概花了40min左右,继续加油加油!!
初始化部分
- 边权的初始化
fill(rode[0], rode[0] + maxn * maxn, inf);
- 因为有很多个case(即需要很多次的使用 B F S BFS BFS函数,所以需要队列的初始化
fill(flag, flag + maxn, false);
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<set>
#include<queue>
#include<map>
#include<stack>
using namespace std;
int n, l;
const int maxn = 1005;
int rode[maxn][maxn];
const int inf = -1;
bool flag[maxn] = { false };
struct node {
int data, layer;
};
int BFS(int st) {
queue<node> q;
node Node;
int sum = 0;
Node.data = st; Node.layer = 0;
q.push(Node);
flag[Node.data] = true;
while (!q.empty()) {
node temp = q.front();
q.pop();
//cout << temp.layer << ' ' << sum << endl;
if (temp.layer == l)return sum;
//cout << '*' << temp.data << '*' << endl;
for (int i = 1; i <= n; i++) {
if (rode[temp.data][i] != inf && flag[i] == false) {
flag[i] = true;
node temp2;
temp2.data = i; temp2.layer = temp.layer + 1;
sum++;
q.push(temp2);
//cout << '(' << temp2.data << ',' << temp2.layer << endl;
}
}
}
return sum;
}
int main() {
//初始化
fill(rode[0], rode[0] + maxn * maxn, inf);
cin >> n >> l;
for (int i = 1; i <= n; i++) {
int m;
cin >> m;
for (int j = 0; j < m; j++) {
int user;
cin >> user;
rode[user][i] = 1;
}
}
int k; cin >> k;
for (int i = 0; i < k; i++) {
fill(flag, flag + maxn, false);
int st;
cin >> st;
int num=BFS(st);
cout << num << endl;
}
return 0;
}
结语
细心细心再细心!!