首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DFS算法始终如一地寻找顶点少于最大值的路径

DFS算法始终如一地寻找顶点少于最大值的路径
EN

Stack Overflow用户
提问于 2020-04-19 14:31:16
回答 1查看 48关注 0票数 0

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

代码语言:javascript
复制
4
1 3 5
5 4 3
7 2 1
6 1 1

第一行是N,后面几行是母牛的x、y和p。下面是我的代码:

代码语言:javascript
复制
#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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 23:42:18

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61300436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档