• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Graf, cykl- skierowany. Pewien problem

Object Storage Arubacloud
+1 głos
366 wizyt
pytanie zadane 31 maja 2017 w C i C++ przez Wiciorny Ekspert (269,710 p.)
zamknięte 31 maja 2017 przez Wiciorny

Witajcie, napisałem program- generalnie wyszukujący " sprawdzający" czy podany graf zawiera cykl. 

Dla grafu skierowanego. W oparciu o materiały z geek'a 

generalnie, nie moge znaleźć przyczyny dlaczego dla grafu nr g1. Zwraca cykl, mimo iż tego cyklu tam nie ma. 

#include <iostream>
#include<list>
#include<string>
#include<vector>

using namespace std;

enum Color {BIALY, SZARY, CZARNY};

class  DirectedGraph {

        int vertex; // wierzcholek
        list<int> *neighbourList; // lista wierzcholkow po koleji ( z racji grafu skierowanego )

        //czasomierz
        double time; // zmienna czasowa
        double *d;   // czas 1 odwiedzin
        double *f; // czas 2 odwiedzin

        public:
        DirectedGraph(int numVertex); // construktor
        void createEdge(int strV, int endV );  // tworzenie krawedzi
        bool DFSsolve(int numVertex,int colorType[]);
        bool startDFS();

};


    // tworzymy graf
    DirectedGraph::DirectedGraph(int numVertex) {
        this->vertex=numVertex; // bo dla kazdego obiektu, instancji
      //  d= new  double[numVertex];   // czas 1 odwiedzin
      //   f= new  double [numVertex];
        this-> neighbourList= new list<int>[numVertex];

    }

    // dodawanie krawedzi
    void DirectedGraph::createEdge(int strV, int endV) {
       this-> neighbourList[strV].push_back(endV); // back, zeby kazdy kolejny byl w odpowiedniej kolejnosci
    }



    bool DirectedGraph::startDFS() {
        time=0;
      int *colorType = new int[vertex];


        for(int i=0;i<vertex;i++){
            colorType[i]=BIALY;

        }

         for(int i=0;i<vertex;i++){
            if(colorType[i]==BIALY)
                if(DFSsolve(i,colorType)== true )
                return true;
            }

         return false;
    }



    bool DirectedGraph::DFSsolve(int ver, int colorType[]){

        colorType[ver]=SZARY;
      //  time+=1;
      //  d[ver]=time;


        list<int>::iterator j;

        for(j=neighbourList[ver].begin(); j!=neighbourList[ver].end();++j){

             int inner=*j;

            if (colorType[inner] == SZARY)
                return true;

            if(colorType[inner]==BIALY &&  DFSsolve(inner,colorType) ){
                    return true;
            }
        }

         colorType[ver]==CZARNY;
      //   time=time+1;
       //  f[ver]=time;
         return false;

    }


int main (){


    DirectedGraph g1(7);
        g1.createEdge(0, 1);
        g1.createEdge(2, 4);
        g1.createEdge(1, 2);
        g1.createEdge(2, 3);
        g1.createEdge(4, 5);
        g1.createEdge(6, 5);
        g1.createEdge(3, 5);
        g1.createEdge(6, 0);
        g1.createEdge(1, 4);



        DirectedGraph g(4);
    g.createEdge(1, 2);
    g.createEdge(2, 3);
    g.createEdge(3, 4);


    	DirectedGraph g3(6);

		g3.createEdge(0, 1);
        g3.createEdge(2, 0);
        g3.createEdge(2, 1);
        g3.createEdge(3, 2);
        g3.createEdge(4, 2);
        g3.createEdge(4, 3);
        g3.createEdge(3, 5);
        g3.createEdge(5, 4);



if (g1.startDFS() )
        cout << "Graph contains cycle \n";
    else
        cout << "Graph doesn't contain cycle\n";



        if (g3.startDFS() )
        cout << "Graph contains cycle \n";
    else
        cout << "Graph doesn't contain cycle\n";

if (g.startDFS() )
        cout << "Graph contains cycle";
    else
        cout << "Graph doesn't contain cycle";





return 0;
}

Jakaś sugestia, nawet nie wiem jakby to debugować. 

komentarz zamknięcia: rozwiązany problem. Dzieki
1
komentarz 31 maja 2017 przez vector Dyskutant (9,200 p.)
edycja 31 maja 2017 przez vector

Najpierw byłoby fajnie, gdyby program nie crashował. Zacznij używać flag kompilatora dotyczących dodatkowych ostrzeżeń są naprawdę przydatne.

Playground ✗ c cycle.cpp -g2 -o cycle
cycle.cpp: In member function ‘bool DirectedGraph::DFSsolve(int, int*)’:
cycle.cpp:88:24: warning: statement has no effect [-Wunused-value]
          colorType[ver]==CZARNY;
          ~~~~~~~~~~~~~~^~~~~~~~
cycle.cpp: In function ‘int main()’:
cycle.cpp:133:5: warning: this ‘else’ clause does not guard... [-Wmisleading-indentation]
     else
     ^~~~
cycle.cpp:138:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘else’
         if (g3.startDFS() )
         ^~
Playground ✗ ./cycle
Graph contains cycle
Graph contains cycle
fish: “./cycle” terminated by signal SIGSEGV (Address boundary error)
Playground ✗ gdb -q cycle
Reading symbols from cycle...done.
(gdb) r
Starting program: /home/vector/Programming/Playground/cycle
Graph contains cycle
Graph contains cycle

Program received signal SIGSEGV, Segmentation fault.
DirectedGraph::DFSsolve (this=this@entry=0x7fffffffe120, ver=<optimized out>, colorType=colorType@entry=0x6154d0) at cycle.cpp:78
78                   int inner=*j;
(gdb) where
#0  DirectedGraph::DFSsolve (this=this@entry=0x7fffffffe120, ver=<optimized out>, colorType=colorType@entry=0x6154d0) at cycle.cpp:78
#1  0x0000000000400cf3 in DirectedGraph::DFSsolve (this=this@entry=0x7fffffffe120, ver=<optimized out>, colorType=colorType@entry=0x6154d0) at cycle.cpp:83
#2  0x0000000000400cf3 in DirectedGraph::DFSsolve (this=this@entry=0x7fffffffe120, ver=<optimized out>, colorType=colorType@entry=0x6154d0) at cycle.cpp:83
#3  0x0000000000400cf3 in DirectedGraph::DFSsolve (this=this@entry=0x7fffffffe120, ver=ver@entry=1, colorType=colorType@entry=0x6154d0) at cycle.cpp:83
#4  0x0000000000400daa in DirectedGraph::startDFS (this=this@entry=0x7fffffffe120) at cycle.cpp:58
#5  0x0000000000400a68 in main () at cycle.cpp:143

// Edit

Masz wycieki pamięci

=================================================================
==27330==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 28 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee328 in operator new[](unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:82
    #1 0x402034 in DirectedGraph::startDFS() /home/vector/Programming/Playground/cycle.cpp:49
    #2 0x402d3a in main /home/vector/Programming/Playground/cycle.cpp:132
    #3 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee328 in operator new[](unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:82
    #1 0x402034 in DirectedGraph::startDFS() /home/vector/Programming/Playground/cycle.cpp:49
    #2 0x402d6a in main /home/vector/Programming/Playground/cycle.cpp:139
    #3 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

Direct leak of 16 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee328 in operator new[](unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:82
    #1 0x402034 in DirectedGraph::startDFS() /home/vector/Programming/Playground/cycle.cpp:49
    #2 0x402d9d in main /home/vector/Programming/Playground/cycle.cpp:144
    #3 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

Indirect leak of 344 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee328 in operator new[](unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:82
    #1 0x401da0 in DirectedGraph::DirectedGraph(int) /home/vector/Programming/Playground/cycle.cpp:36
    #2 0x402b2a in main /home/vector/Programming/Playground/cycle.cpp:100
    #3 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

Indirect leak of 296 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee328 in operator new[](unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:82
    #1 0x401da0 in DirectedGraph::DirectedGraph(int) /home/vector/Programming/Playground/cycle.cpp:36
    #2 0x402c7b in main /home/vector/Programming/Playground/cycle.cpp:119
    #3 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

Indirect leak of 200 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee328 in operator new[](unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:82
    #1 0x401da0 in DirectedGraph::DirectedGraph(int) /home/vector/Programming/Playground/cycle.cpp:36
    #2 0x402c1f in main /home/vector/Programming/Playground/cycle.cpp:113
    #3 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x7fdb6edee168 in operator new(unsigned long) /build/gcc-multilib/src/gcc/libsanitizer/asan/asan_new_delete.cc:80
    #1 0x4080dd in __gnu_cxx::new_allocator<std::__cxx1998::_List_node<int> >::allocate(unsigned long, void const*) /usr/include/c++/7.1.1/ext/new_allocator.h:111
    #2 0x407f0c in std::allocator_traits<std::allocator<std::__cxx1998::_List_node<int> > >::allocate(std::allocator<std::__cxx1998::_List_node<int> >&, unsigned long) /usr/include/c++/7.1.1/bits/alloc_traits.h:436
    #3 0x407857 in std::__cxx1998::__cxx11::_List_base<int, std::allocator<int> >::_M_get_node() /usr/include/c++/7.1.1/bits/stl_list.h:383
    #4 0x406b8e in std::__cxx1998::_List_node<int>* std::__cxx1998::__cxx11::list<int, std::allocator<int> >::_M_create_node<int const&>(int const&) /usr/include/c++/7.1.1/bits/stl_list.h:572
    #5 0x40595c in void std::__cxx1998::__cxx11::list<int, std::allocator<int> >::_M_insert<int const&>(std::__cxx1998::_List_iterator<int>, int const&) /usr/include/c++/7.1.1/bits/stl_list.h:1801
    #6 0x403fca in std::__cxx1998::__cxx11::list<int, std::allocator<int> >::push_back(int const&) /usr/include/c++/7.1.1/bits/stl_list.h:1118
    #7 0x401f55 in DirectedGraph::createEdge(int, int) /home/vector/Programming/Playground/cycle.cpp:42
    #8 0x402bc0 in main /home/vector/Programming/Playground/cycle.cpp:106
    #9 0x7fdb6d3b8439 in __libc_start_main (/usr/lib/libc.so.6+0x20439)

// ...

SUMMARY: AddressSanitizer: 1388 byte(s) leaked in 26 allocation(s).

 

Jak napisałeś kod dla numeracji wierzchołków od 0 do n-1 to się jego trzymaj do końca.

// To jest źle
DirectedGraph g(4);
g.createEdge(1, 2);
g.createEdge(2, 3);
g.createEdge(3, 4);

// Powinno być
DirectedGraph g(4);
g.createEdge(0, 1);
g.createEdge(1, 2);
g.createEdge(2, 3);

 

Ta linijka powoduje że dostajesz złe wyniki

colorType[ver]==CZARNY;

 

komentarz 31 maja 2017 przez Wiciorny Ekspert (269,710 p.)

program nie crashuje, u mnie.

Druga sprawa 

// To jest źle
DirectedGraph g(4);
g.createEdge(1, 2);
g.createEdge(2, 3);
g.createEdge(3, 4);

to nie jest źle, ilość krawędzi nie ma wpływu... "4" to liczba wierzchołków i nikt nie mówi że wierzchołek ma mieć nr 0... 

jest o nr: 1,2,3,4 :) 

Co do ostatniego, sam nie wierze... literówka niby takie coś ... zamiast przypisać to porównać oj boże, dzieki.

 

komentarz 31 maja 2017 przez vector Dyskutant (9,200 p.)

Jest źle ponieważ masz w konstruktorze

this-> neighbourList= new list<int>[numVertex];

a w funkcji dfs

for(j=neighbourList[ver].begin(); j!=neighbourList[ver].end();++j){

W przypadku kiedy numVertex = 4 to masz indeksowanie od 0 do 3 włącznie, a w tej pętli pojawi się ver wielkości 4 co powoduje komunikat

fish: “./cycle” terminated by signal SIGSEGV (Address boundary error)
komentarz 31 maja 2017 przez Wiciorny Ekspert (269,710 p.)

a end(). nie zwraca przypadkiem końca- jako ostatniego elementu?

Z racji, mp alokuje pamięc na 10 elementów, ale wpiszę 5. 

To funkcja nie  zakonczy sie przy 5? 

Returns an iterator referring to the past-the-end element in the list container.

 

1
komentarz 1 czerwca 2017 przez Patryk Kaczmarek Użytkownik (630 p.)
end() zwraca za ostatni element, czyli miejsce, które już nie należy do kontenera
komentarz 1 czerwca 2017 przez Wiciorny Ekspert (269,710 p.)
Dzieki chłopaki za pomoc.

Podobne pytania

+1 głos
0 odpowiedzi 573 wizyt
pytanie zadane 16 stycznia 2018 w Algorytmy przez karola Nowicjusz (230 p.)
0 głosów
0 odpowiedzi 521 wizyt
pytanie zadane 26 kwietnia 2019 w C i C++ przez Fr3sh98x Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 76 wizyt

92,555 zapytań

141,403 odpowiedzi

319,553 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...