清梦123456 2024-08-15 11:35 采纳率: 90.9%
浏览 2
已结题

图的深度优先遍历出错

题目:
k(1≤k≤100)只奶牛分散在n(1≤n≤1000)个牧场。

现在它们要集中起来进餐。

牧场之间有m(1≤m≤10000)条有向路连接,而且不存在起点和终点相同的有向路。

它们进餐的地点(牧场)必须是所有奶牛都可到达的地方.那么,有多少这样的牧场呢?

第一行共三个整数k,n,m

接下来k行,每行一个整数表示一只奶牛所在的牧场编号

接下来m行,每行两个整数,表示一条有向路的起点和终点

所有奶牛都可到达的牧场个数
输入样例:
2 4 4
2
3
1 2
1 4
2 3
3 4
输出样例:
2
但是我这个深度优先DFS的代码输出是0
代码:


#include <bits/stdc++.h>
using namespace std;
int num[1005],vis[1005],cnt[1005];
int k,n,m,ans;
vector<int>v[1005];
void DFS(int x)
{
    cnt[x]++;
    vis[x]=1;
    for(int i=1;i<=v[x].size();i++)
    {
        if(!vis[v[x][i]])
        {
            DFS(v[x][i]);
        }
    }
}
int main()
{
    cin >> k >> n >> m;
    for(int i=1;i<=k;i++)
    {
        cin >> num[i];
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin >> x >> y;
        v[x].push_back(y);
    }
    for(int i=1;i<=k;i++)
    {
        memset(vis,0,sizeof(vis));
        DFS(num[i]);
    }
    for(int i=1;i<=n;i++)
    {
        if(cnt[i]==k)
        {
            ans++;
        }
    }
    cout<<ans;
    return 0;
}

有没有人知道怎么改的?知道的请帮我一下,谢谢!

  • 写回答

2条回答 默认 最新

  • GISer Liu 2024-08-15 11:37
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    好的,我们来详细分析并解决这个问题。

    问题分析

    用户的问题是关于图的深度优先遍历(DFS)的实现,目的是找出所有奶牛都可以到达的牧场数量。用户的代码在实现DFS时存在一些问题,导致输出结果不正确。

    问题关键点

    1. DFS遍历逻辑:确保DFS能够正确遍历所有可达的牧场。
    2. 访问标记:确保每个奶牛的DFS遍历不会互相干扰。
    3. 计数逻辑:确保每个牧场的可达性被正确计数。

    代码问题定位

    1. DFS遍历逻辑:在DFS函数中,遍历邻接表时索引错误。
    2. 访问标记:每次DFS遍历前需要重置访问标记数组。
    3. 计数逻辑:确保每个牧场的可达性被正确计数。

    解决方案

    1. 修正DFS遍历逻辑:确保正确遍历邻接表。
    2. 访问标记重置:每次DFS遍历前重置访问标记数组。
    3. 计数逻辑:确保每个牧场的可达性被正确计数。

    修改后的代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int num[1005], vis[1005], cnt[1005];
    int k, n, m, ans;
    vector<int> v[1005];
    
    void DFS(int x) {
        cnt[x]++;
        vis[x] = 1;
        for (int i = 0; i < v[x].size(); i++) { // 修正遍历逻辑
            if (!vis[v[x][i]]) {
                DFS(v[x][i]);
            }
        }
    }
    
    int main() {
        cin >> k >> n >> m;
        for (int i = 1; i <= k; i++) {
            cin >> num[i];
        }
        for (int i = 1; i <= m; i++) {
            int x, y;
            cin >> x >> y;
            v[x].push_back(y);
        }
        for (int i = 1; i <= k; i++) {
            memset(vis, 0, sizeof(vis)); // 重置访问标记
            DFS(num[i]);
        }
        for (int i = 1; i <= n; i++) {
            if (cnt[i] == k) {
                ans++;
            }
        }
        cout << ans;
        return 0;
    }
    

    修改说明

    1. DFS遍历逻辑:将 for (int i = 1; i <= v[x].size(); i++) 修改为 for (int i = 0; i < v[x].size(); i++),确保正确遍历邻接表。
    2. 访问标记重置:在每次DFS遍历前,使用 memset(vis, 0, sizeof(vis)) 重置访问标记数组。
    3. 计数逻辑:确保每个牧场的可达性被正确计数。

    总结

    通过上述修改,确保了DFS遍历逻辑的正确性,访问标记的重置,以及计数逻辑的正确性。这样,程序就能够正确计算出所有奶牛都可以到达的牧场数量。希望这个解决方案能够帮助到你!

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月15日
  • 已采纳回答 8月15日
  • 创建了问题 8月15日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?