2 条题解

  • 1
    @ 2024-5-14 20:39:43

    蒟蒻将邻接表和 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
      @ 2024-4-25 19:19:45

      题意&思路

      给定一个有 nn 个点 n1n-1 条边的无向连通图,规定每一条边的长度都为 11。求从编号为 11 的点走 dd 步最多可以到达几个不同的点。

      虽然 n1n-1 条边的图就是树,但也可以按照图的方法来做。

      先存图,再从点 11 开始记忆化搜索,最坏情况下图中的每一个点都遍历一次,时间复杂度为 O(n)O(n),不会超时。

      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
      上传者