Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zadanie i kod do analizy/poprawy

Ostatnio zmodyfikowano 2019-02-22 14:49
Autor Wiadomość
Mamcia
Temat założony przez niniejszego użytkownika
Zadanie i kod do analizy/poprawy
» 2019-02-22 09:25:42
Witam serdecznie,

mam takie zadanie:
http://solve.edu.pl/contests​/download_desc/2011

Dany jest graf nieskierowany. Sprawdź jego spójność.
W pierwszej linii wejścia dana jest liczba zestawów danych. Każdy zestaw składa się z liczb N i M, które
oznaczają liczbę wierzchołków oraz krawędzi grafu. Następnie danych jest M linii, a w każdej z nich liczby
A,B, które oznaczają, że istnieje krawędź między wierzchołkami A oraz B.

Dla każdego testu należy wypisać TAK, je˙zeli graf jest spójny lub NIE w przeciwnym wypadku.

Mam napisany taki kod, niestety nie działa poprawnie.
Może ktoś widzi błąd i pomoże poprawić?

Ten przechodzi dwa testy z pięciu:

C/C++
#include <bits/stdc++.h>
using namespace std;
vector < int > graf[ 1000001 ];

bool odw[ 1000005 ];
int tops2 = 0;
bool cohesion[ 1000005 ];
void DFS( int v )
{
    odw[ v ] = true;
    tops2++;
    for( int i = 0; i < graf[ v ].size(); i++ )
    {
        if( !odw[ graf[ v ][ i ] ] )
        {
            DFS( graf[ v ][ i ] );
        }
    }
}
int main()
{
    ios_base::sync_with_stdio( false );
    cin.tie( 0 );
    cout.tie( 0 );
   
    int zestawy, tops, edges;
    cin >> zestawy;
    for( int i = 0; i < zestawy; ++i ) {
        tops2 = 0;
        // linia na czyszczenie wektora
        cin >> tops >> edges;
        for( int j = 0; j < edges; j++ )
        {
            int a, b;
            cin >> a >> b;
            graf[ a ].push_back( b );
            graf[ b ].push_back( a );
        }
       
        DFS( 1 );
        //      cout<<tops2<<endl;
        if( tops2 == tops ) {
            cohesion[ i ] = true;
        }
    }
   
    for( int i = 0; i < zestawy; ++i ) {
        if( cohesion[ i ] ) cout << "TAK\n";
        else cout << "NIE\n";
       
    }
   
    return 0;
   
}

Prawdopodobnie nie czyści graf po teście ale nie wiem jak to zrobić dokładnie i czy miejsce, które sugeruję w kodzie jest dobre?
Jak dodam:

C/C++
for( int i = 1; i <= tops; i++ )
     graf[ i ].clear();


to mi się wysypuje i mam: Segmentation fault   :-(
P-174039
pekfos
» 2019-02-22 13:09:34
A nie przechodzi testu, bo..? Zła odpowiedź? Błąd wykonania? Twój rekurencyjny DFS nie jest właściwym podejściem dla tak potencjalnie dużych danych. Dla grafu który jest N-elementową ścieżką dla maksymalnego dozwolonego w zadaniu N, twój program się pewnie wysypie.

Koniecznie zapoznaj się też z » Kurs C++ / FAQMam problem z zadaniem ze SPOJa pytanie/odpowiedź.
P-174040
Mamcia
Temat założony przez niniejszego użytkownika
» 2019-02-22 13:16:08
Przechodzi dwa testy z pięciu, na trzecim teście mam błędną odpowiedź.
10^6 to nie jest przecież jakaś wielka liczba.
P-174041
pekfos
» 2019-02-22 13:20:18
10^6 to nie jest przecież jakaś wielka liczba.
Zakład?
C/C++
int main()
{
    for( int i = 1; i < 1000000; ++i )
         graf[ i ].push_back( i + 1 );
   
    DFS( 1 );
    return 0;
}
P-174042
Mamcia
Temat założony przez niniejszego użytkownika
» 2019-02-22 13:25:22
To co powinienem zrobić ?
P-174043
pekfos
» 2019-02-22 13:28:07
Nie używać rekurencji.
P-174044
Mamcia
Temat założony przez niniejszego użytkownika
» 2019-02-22 13:48:37
cholercia czyli iteracja? nie wiem czy ogarnę :-)
Może ktoś jest w stanie pomóc w zmianie rekurencji w moim kodzie na iterację ?
P-174046
pekfos
» 2019-02-22 13:57:50
W takim prostym algorytmie to trywialne. Zamiast wywoływać funkcję rekurencyjnie, zapisuj argument do jakiegoś kontenera. Algorytm zaczyna ze startową wartością w kontenerze i wykonuje się tak długo, aż kontener będzie pusty. Dla BFS kontener powinien się zachowywać jak kolejka, a dla DFS jak stos.
P-174048
« 1 » 2
  Strona 1 z 2 Następna strona