Я решаю проблему программирования с помощью dfs. Tldr выглядит следующим образом: в координатах x, y есть n коров. Они могут общаться с другими людьми в пределах своего радиуса «голоса» с. То, что корова a может общаться с коровой b, не означает, что b может общаться обратно, если ей не хватает p. Если сообщение начинается с какой-либо коровы, какое наибольшее количество коров оно сможет достичь? Коровы могут передавать сообщения от одного к другому. Ex. Если 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, а не в создании списка смежности. Мой код работает только для примера. По сути, я делаю DFS для всех n случаев запуска коров для сообщения.