[PAT解题报告] Forwards on Weibo
这个题我觉得也不难。给定微博上每个人的粉丝数,假设它发一条微博,所有粉丝都会转发,并且粉丝的粉丝也会转发……问L层之后有多少人转发,其实就是查询每个人的L级粉丝数。
如果A是B的粉丝,就连一条B到A的边,我们就有了一个有向图,原始问题变成了查询一个点距离不超过L的点有哪些了。
查询有多个,显然可以根据每个查询bfs
L层……我采用了最暴力的做法,先用n^3的floyd算出任意两点间的最短路,对每个查询,枚举所有点,把距离不超过L的都输出就好了。
代码:
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int f[1024][1024];
void better(int &x,int y) {
if ((x < 0) || (x > y)) {
x = y;
}
}
int main() {
int n,m;
memset(f,0xff,sizeof(f));
scanf("%d%d",&n,&m);
for (int i = 1; i <= n; ++i) {
int j;
for (scanf("%d",&j);j;--j) {
int x;
scanf("%d",&x);
f[x][i] = 1;
}
}
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
if (f[i][k] >= 0) {
for (int j = 1; j <= n; ++j) {
if (f[k][j] >= 0) {
better(f[i][j],f[i][k] + f[k][j]);
}
}
}
}
}
int x;
for (scanf("%d",&x);x;--x) {
int y;
scanf("%d",&y);
int z = 0;
for (int i = 1; i <= n; ++i) {
if ((i != y) && (f[y][i] >= 0) && (f[y][i] <= m)) {
++z;
}
}
printf("%d\n",z);
}
return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1076
深信服公司福利 851人发布