2 条题解
-
1
蒟蒻将邻接表和 dfs 组合到一起就得到了一下代码:
#include <bits/stdc++.h> #define ll long long #define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) using namespace std; const int MAXN = 1e5 + 5; vector<int> g[MAXN]; bool vis[MAXN]; int n, d, ans; void dfs(int now, int dis) { vis[now] = 1; if (dis == d) return ; for (auto i : g[now]) { if (!vis[i]) { dfs(i, dis + 1); ans++; } } } int main() { IOS; cin >> n >> d; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(1, 0); cout << ans << endl; return 0; }
-
0
题意&思路
给定一个有 个点 条边的无向连通图,规定每一条边的长度都为 。求从编号为 的点走 步最多可以到达几个不同的点。
虽然 条边的图就是树,但也可以按照图的方法来做。
先存图,再从点 开始记忆化搜索,最坏情况下图中的每一个点都遍历一次,时间复杂度为 ,不会超时。
AC Code
#include<bits/stdc++.h> #define ll long long using namespace std; const ll N=1e5+5; ll n,d,ans; vector<ll> vec[N]; bool flag[N]; void dfs(ll x,ll step){ if(flag[x]||step>d) return; flag[x]=1; ans++; for(auto i=vec[x].begin();i!=vec[x].end();i++) dfs(*i,step+1); } int main(){ scanf("%lld%lld",&n,&d); for(ll i=1,u,v;i<n;i++) scanf("%lld%lld",&u,&v),vec[u].push_back(v),vec[v].push_back(u); dfs(1,0); printf("%lld",ans-1); // ans会将点1也算进去,所以要-1 return 0; }
- 1
信息
- ID
- 718
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 194
- 已通过
- 81
- 上传者