DFS 算法始终找到顶点少于最大值的路径
DFS Algorithm consistently finds path with less vertices than maximum
我正在用 dfs 解决编程问题。 tldr 如下所示:
在坐标 x,y 处有 n 头奶牛。他们可以与 "voicability" 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。
错误很简单。您测量最长的路径长度(实际上是奶牛数)。但问题是不同的,它是如何可以到达奶牛的。考虑三头牛的情况,其中一头可以被所有人听到,而其他的则没有声音。你的程序将回答 2(除非我错过了另一个错误),因为这是最长的链,但正确答案是 3(它是奶牛的数量 visited
)。
我正在用 dfs 解决编程问题。 tldr 如下所示: 在坐标 x,y 处有 n 头奶牛。他们可以与 "voicability" 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。
错误很简单。您测量最长的路径长度(实际上是奶牛数)。但问题是不同的,它是如何可以到达奶牛的。考虑三头牛的情况,其中一头可以被所有人听到,而其他的则没有声音。你的程序将回答 2(除非我错过了另一个错误),因为这是最长的链,但正确答案是 3(它是奶牛的数量 visited
)。