1076. Forwards on Weibo (30)

来源:互联网 发布:蜂窝移动网络搜索 导航 编辑:程序博客网 时间:2024/06/06 07:43

一开始以为是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

原创粉丝点击