Dlaczego mój program daje złe wyniki? Zadanie Łuk Triumfalny OI (drzewa)

0

Mam takie zadanie: https://szkopul.edu.pl/problemset/problem/jgCcEjQu3kdpM4BmxA6GujfX/site/?key=statement
No i lecę sobie DFS i sprawdzam w każdym wierzchołku czy potrzebuje dodatkowych robotników, program daje błędny wynik dopiero w testach gdy n > 1000 więc trudno coś takiego debuggować. Program zwraca zbyt mały wynik np. potrzeba 6 robotników a mój program zwraca 5. Czy ktoś pomógłby mi znaleźć relatywnie małe testy dla których mój program daje błędne odpowiedzi?

#include <bits/stdc++.h>
    
using namespace std;
    
#define ll long long
#define ull unsigned long long
    
#define fi first
#define se second
    
#define FOR(x, y, z) for (int z = x; z < y; z++)
#define FORD(x, y, z) for (int z = x; z > y; z--)

const int MAXN = 3e5 + 7;
vector<vector<int>> graph(MAXN);
int min_need_workers = 0;

void dfs(int p, int idx, int deep, int prev_need_bows_to_build, int act_workers){
    while((int)graph[idx].size()-(p!=-1) + prev_need_bows_to_build > act_workers * deep)
        act_workers++;
    for (auto child : graph[idx]){
        if (child != p)
            dfs(idx, child, deep+1, prev_need_bows_to_build+graph[idx].size()-(p!=-1), act_workers);
    }
    min_need_workers = max(min_need_workers, act_workers);
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, a, b;
    cin >> n;
    FOR(0, n-1, i){
        cin >> a >> b;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }

    dfs(-1, 1, 1, 0, 0);

    cout << min_need_workers << "\n";

    return 0;
}
1

Osobiście nie rozumiem jednego z treści zadania. Widzę dwuznaczność.
Gdy król odwiedza kolejne miasto, to wiem w którym mieście jest obecnie, czy może wiem tylko, że pierwszego dnia zaczął od miasta 1?
W pierwszym wypadku, muszę znaleźć wierzchołek o największej ilości krawędzi (wynik to, liczba krawędzi -1) (wtedy zadanie jest proste jak konstrukcja cepa).
W drugim muszę ustalić największą szerokość drzewa (i to jest wynik) (trudniejsze - a BFS załatwia to dość szybko).

Przykład daje ten sam wynik w obu wypadkach.

Którą wersję zaimplementowałeś? Może powinieneś spróbować tą drugą wersję.

Co do samego C++. Na litość boską wywal te straszne makra.

Przykład drzewa, które da różnicę obu wypadków:

      1
    /   \
  2      3
 / \     |
4   5    6
0

król nie będzie się cofał, ponieważ coś takiego nie będzie optymalne, więc zostaje nam zorbić tak program jakby król szedł najkrótsza trasą do liścia np jak DFS

Zdecydowanie BFS, nie DFS. BFS porusza się wartstwami po grafie, a to jest blisko tego czego szukasz.
https://en.wikipedia.org/wiki/Breadth-first_search

0

@MarekR22
"Król właśnie wkroczył do stolicy Bajtocji. [...] zaplanował pochód triumfalny, w którym odwiedzi wszystkie miasta Bajtocji, zaczynając z miasta, w którym aktualnie przebywa. [...] Miasta są ponumerowane od 1 do , przy czym stolica Bajtocji ma numer 1. "
Prawda pokręcone, powinno od razu pisać że zaczyna od 1

"Każda ekipa codziennie może wybudować jeden łuk, w dowolnie wybranym mieście. Niestety nikt nie wie, w jakiej kolejności król będzie odwiedzał miasta. Wiadomo jedynie, że każdego dnia król przemieści się z miasta, w którym się aktualnie znajduje, do sąsiedniego miasta. "
W każdym przejściu króla możemy wybudować (ilość robotników) łuków triumfalnych w dowolnych miastach
Nie znamy trasy króla, może wybrać każdą

W drzewie którym pokazałęś odpowiedź to 2. Nieważne jaką trasę wybierze król, robotnicy go wyprzedzą

1

Planujemy rozkład prace ekip od razu pierwszego do ostatniego dnia dla wszystkich miast od razu?
Czy planujemy prace ekip tylko na dzień następny, bo każdego dnia wiemy, gdzie jest król?

Ja stawiam na wersję pierwszą, bo daje wiesze wartości, a napisałeś, ze twój kod zaniża wyniki.

0

Znalazłem test w którym mój program daje inne wyniki niż wzorcówka:
15
1 2
1 3
3 4
4 5
4 6
4 7
4 12
4 13
3 8
8 9
8 10
8 11
8 14
8 15
Tutaj można sobie zobrazować
@MarekR22 Masz rację, pierwszego dnia musimy zaplanować jak będziemy budować łuki, mój algorytm "szedł" z królem, tak jakby później wiedział gdzie on jest.

1 użytkowników online, w tym zalogowanych: 0, gości: 1