Cześć mam problem. Zrobiłem projekt na studia którego zadaniem jest wczytać graf, sprawdzić jego dwudzielność i określić maksymalne skojarzenie w grafie. Graf przechowuje w ten sposób:
struct I
{
int i;
int nr;
};
...
vector<vector<I>> wierzcholki
dwudzielność określam prawidłowo, a do matchingu skorzystałem z algorytmu Hopcrofta-Karpa.
Zadanie muszę wrzucić na spoja i dla maksymalnie dużych danych wejściowych na moim komputerze wyniki są raczej na pewno prawidłowe i mieszczę się w czasach. Jednak na spoju przekracza mi czasy w połowie testów które prawdopodobnie wcale nie są nawet maksymalnie dużych rozmiarów i chyba domyślam się w czym tkwi problem. Muszę przekazywać graf wielokrotnie do jednej funkcji a wiec chce przekazać wierzchołki utworzone powyżej w funkcji main. Początkowo przekazywałem je w ten sposób:
bool Match(vector<vector<I>> wierzcholki)
i już wtedy miałem problem z czasami dokładnie w tych samych testach. Program działał ale dość wolno dla większych testów mulił i doszedłem do wniosku, że to przez tą funkcję. Poszukałem trochę i znalazłem, że ludzie przekazują do funkcji vector raczej tak: bool Match(vector<vector<I>> &wierzcholki)
tzn ze znaczkiem referencji. Po czym na moim komputerze program zaczął działać niesamowicie sprawniej jednak na spoju dalej mam problem z czasem w tych samych miejscach i jestem raczej prawie pewien, że problemem jest dalej to samo. Tak więc moje pytania brzmią skąd to spowolnienie, bo cały czas myślałem, że vector jest przekazywany jak tablica czyli zwykły wskaźnik, a tu klops... No i najważniejsze pytanie czy mogę przekazać te vectory w jakiś inny spoób? Prosił bym o konkretne propozycje bo korzystam z tego bardziej intuicyjnie i dość sprawnie ale jednak nie do końca pewnie. Tak więc czy istnieje jakiś inny możliwy zapis? zaczynając od typedef vec<vec< i>> choć gdy ja to napisałem to nie poszło i tez pytanie dlaczego :/... do najróżniejszych innych sposobów. Proszę o wszelkie pomysły. Dodatkowo chciał bym jeszcze spytać czy zamiana sposobu definicji vector<list< I>> zrobi jakąś konkretną różnicę? Czasową albo jaką kolwiek i czy przekazywać to wtedy ze znaczkiem referencji czy jakos inaczej?. Dzięki za wszelkie podpowiedzi i odpowiedz na pytania.
Pozdrawiam</i></i></i>