【问题标题】:DFS Algorithm consistently finds path with less vertices than maximumDFS 算法始终找到顶点少于最大值的路径
【发布时间】:2020-04-19 06:31:16
【问题描述】:

我正在用 dfs 解决编程问题。 tldr 如下: 在坐标 x, y 处有 n 头奶牛。他们可以在“可表达性”p 的范围内与其他人交流。仅仅因为牛 a 可以与牛 b 通信,并不意味着 b 可以在没有足够 p 的情况下进行通信。如果一条消息从任何一头奶牛开始,它能够到达的最大奶牛数量是多少?奶牛可以将信息从一个传递到另一个。前任。如果 b 可以听到 a,而 c 听不到 a 但可以听到 b,则 b 可以将信息从 a 传递给 c,因此在这种情况下 3 头奶牛听到了信息。 这是一个示例输入:

4
1 3 5
5 4 3
7 2 1
6 1 1

第一行是 N,接下来的行是奶牛的 x、y 和 p。这是我的代码:

#include <iostream>
#include <cmath>
using namespace std;
int n;
int best=0;
int cnt=1;
struct cow {
    int x, y, p;
    bool visited=0;
} cows[201];
bool adj[201][201];
bool access (int a, int b) {
    return pow(cows[b].x-cows[a].x, 2)+pow(cows[b].y-cows[a].y, 2)<=pow(cows[a].p, 2);
}
void dfs(int cow1) {
    for (int i=1; i<=n; i++) {
        if (cnt>best)
        best=cnt;
        if ((!cows[i].visited)&&(adj[cow1][i])) {
            cnt=cnt+1;
            cows[i].visited=1;
            dfs(i);
        }
    }
    return;
}

int main () {
    cin>>n;
    for (int i=1; i<=n; i++) {
        cin>>cows[i].x>>cows[i].y>>cows[i].p;
    }
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++) {
            if (i!=j) {
            if(access(i, j)) {
                adj[i][j]=1;
            }
            else {
                adj[i][j]=0;
            }
        }
        }
    }
    for (int i=1; i<=n; i++) {
        cows[i].visited=1;
        dfs(i);
        cnt=1;
        for (int j=1; j<=n; j++) {
            cows[j].visited=0;
        }
    }
    cout<<best;
}

我不太确定问题出在哪里,但我确定它在 dfs 函数中,而不是在邻接列表的创建中。我的代码仅适用于示例案例。我本质上是对所有 n 例开始牛的消息进行 dfs。

【问题讨论】:

  • 您的代码仅适用于示例案例是什么意思?它会抛出错误吗?如果是,是哪一个?另外,我看到的第一件事是您正在以一种可疑的方式初始化您的数组。不要在你的结构之后立即使用cows[201],而是考虑使用用户提供的n 以正确的大小在主函数中初始化数组并将数组作为参数传递。同样在 C++ 中,数组枚举从 0 开始,一直到 n-1。因为你给你的数组一个静态大小,这可能还没有导致错误,但如果你真的初始化了 201 头奶牛,它会。
  • 不是错误,它只是输出错误的答案
  • 其余的对我来说看起来不错..也许其他人会看到它。但请修复你的阵列。您还在最后一行第 6 行的 for 循环中从 0 开始重置数组(而在其他任何地方都从 1 开始),并且正在访问未定义对象的属性。这种东西会导致 C++ 中的未定义行为。但我认为这不一定会伪造你的结果。到处都是从 0 开始,一直到 n-1。

标签: c++ recursion graph depth-first-search directed-graph


【解决方案1】:

错误很简单。您测量最长的路径长度(实际上是牛数)。但问题是不同的,它是如何到达奶牛的。考虑三头奶牛的情况,其中一头人人都能听到,而其他人则无声。你的程序会回答 2(除非我错过了另一个错误),因为这是最长的链,但正确的答案是 3(它是奶牛的数量 visited)。

【讨论】:

  • 我刚刚测试了我的代码,它确实输出了 2,而答案是 3。但是,我不太确定为什么最长的路径长度与可到达的奶牛的数量不同。这不是一回事吗?
  • 一头奶牛的声音可以同时传到几头头奶牛
猜你喜欢
  • 2020-11-01
  • 2021-06-30
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多