一开始以为是dfs水题
直接邻接表做,然后超时。。。。
#include <bits/stdc++.h>
using namespace std;
int n, level, re, limit;
bool istaked[1001];
vector<vector<int> > arr;
void dfs(int start)
{
limit++;//记录层数,超过level直接返回
if (limit > level)
{
limit--;
return;
}
int i, j;
int len = arr[start].size();
for (i = 0; i < len; i++)
{
if (!istaked[arr[start][i]])
{
istaked[arr[start][i]] = true;
re++;
}
dfs(arr[start][i]);//之所以放在if外面,是因为你通过不同路径,可能会得到不一样的结果
}
limit--;
}
int main(void)
{
cin >> n >> level;
arr.resize(n + 1);
int i, j;
for (i = 1; i <= n; i++)
{
int num;
scanf("%d", &num);//因为感觉1000个数,怕超时,还是用了scanf
for (j = 1; j <= num; j++)
{
int tmp;
scanf("%d", &tmp);
arr[tmp].push_back(i);
}
}
int chaxun;
cin >> chaxun;
while (chaxun--)
{
int index;
re = 0;
memset(istaked, false, 1001);
cin >> index;
istaked[index] = true;//这个很容易漏掉,漏掉就GG了
dfs(index);
printf("%d\n", re);
}
}
果然最后一个点超时
参考了一下网上的代码
贴一下我的AC代码吧:
#include <bits/stdc++.h>
using namespace std;
int n, level, re;
bool istaked[1001];
vector<vector<int> > arr;
void bfs(int start)
{
queue<int> res;
res.push(start);
int cengshu[1001];
memset(cengshu, 0, sizeof(int) * 1001);
cengshu[start] = 0;
int i, j;
while (!res.empty())
{
int index = res.front();
int temp = cengshu[index];
if (temp > level) break;
res.pop();
int len = arr[index].size();
re++;
for (i = 0; i < len; i++)
{
if (!istaked[arr[index][i]])
{
istaked[arr[index][i]] = true;
cengshu[arr[index][i]] = temp + 1;
res.push(arr[index][i]);
}
}
}
}
int main(void)
{
cin >> n >> level;
arr.resize(n + 1);
int i, j;
for (i = 1; i <= n; i++)
{
int num;
scanf("%d", &num);
for (j = 1; j <= num; j++)
{
int tmp;
scanf("%d", &tmp);
arr[tmp].push_back(i);
}
}
int chaxun;
cin >> chaxun;
while (chaxun--)
{
int index;
re = 0;
memset(istaked, false, 1001);
cin >> index;
istaked[index] = true;
bfs(index);
printf("%d\n", re - 1);
}
}
然后我自己想了一下为什么这里BFS能过,而DFS不能过
这个题目的特点是:层数
它特别限制了你的层数
我们知道,dfs的时间复杂度是n!
如果n为1000,第5层需要t的时间来判断,那么你第六层就需要1000t的时间来判断!
如果用dfs,很显然,你是要多判断一层数据是不是在题目所给的层数限制范围内
而bfs呢,你在遇到第一个超过层数的数据的时候,直接break,省下了1000t的时间
所以这里要用bfs