BFS
关于这一题的讨论http://www.zhihu.com/question/28264519/noti-answers?group_id=551873187470827520
我的代码
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
bool graph[1005][1005];
int flag[1005];
int level;
int NUM[1005];
queue<int> q;
void BFS(int s,int n){
int i,num = 0,count = 0;
memset(flag, 0, sizeof(flag));
for (; !q.empty(); q.pop());
flag[s - 1] = 1;
q.push(s-1);
int f = 0;
while (!q.empty()){
int node = q.front();
q.pop();
f = 0;
for (i = 0; i < n; ++i){
if (graph[i][node] && !flag[i] && i != node&&i != s - 1){
flag[i] = flag[node] + 1;
if (flag[i] < level + 1){
q.push(i);
}
++num;
}
if (!flag[i])
f = 1;
}
//if (!f)
//break;
}
NUM[s - 1] = num;
}
int main(){
freopen("1.in", "r", stdin);
int NumOfUser;
memset(graph, 0, sizeof(bool));
scanf("%d%d", &NumOfUser, &level);
int i, j,NumOfFollow,follow;
for (i = 0; i < NumOfUser; i++){
scanf("%d", &NumOfFollow);
for (j = 0; j < NumOfFollow; j++){
scanf("%d", &follow);
graph[i][follow - 1] = true;
}
}
int times,qury;
//for (i = 0; i < NumOfUser;i++)
BFS(i, NumOfUser);
scanf("%d", ×);
while (times--){
scanf("%d", &qury);
BFS(qury, NumOfUser);
printf("%d\n", NUM[qury-1]);/*
for (i = 0; i < NumOfUser; i++)
if (user[i].flag&&user[i].flag <= level)
printf("%d", i+1);
putchar('\n');*/
}
return 0;
}
知乎上某大神的代码,学习一下:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 1000 + 5;
int N, L, K;
int v[maxn], h[maxn];
vector<int> e[maxn];
int main()
{
scanf("%d%d", &N, &L);
for (int i = 1; i <= N; ++i) {
int x, y;
scanf("%d", &x);
while (x--) {
scanf("%d", &y);
e[y].push_back(i);
}
}
scanf("%d", &K);
for (int k = 1; k <= K; ++k) {
int src;
scanf("%d", &src);
v[src] = k;
h[src] = 0;
vector<int> q;
q.push_back(src);
for (int i = 0; i < q.size(); ++i) {
int x = q[i];
if (h[x] >= L)
break;
for (int j = 0; j < e[x].size(); ++j) {
int y = e[x][j];
if (v[y] != k) {
v[y] = k;
h[y] = h[x] + 1;
q.push_back(y);
}
}
}
printf("%d\n", q.size() - 1);
}
return 0;
}