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
阅读全文
0 0
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- 1076. Forwards on Weibo (30)
- Mysterious Bacteria ( lightOJ 1220)
- 树,UVA 548
- python3.6基础学习记录(一)
- Java集合
- Redis 集群端口
- 1076. Forwards on Weibo (30)
- iOS_常用的小功能
- Vijos / 题库 / SuperBrother打鼹鼠 1512
- mysql5.7.19用户的创建和权限的操作
- java做空心菱形
- codeforces 832D Misha, Grisha and Underground 倍增lca
- HNUSTOJ 1587: 土豪金的加密与解密
- Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant)
- hdu1711--kmp入门题