Sprawdzanie cykliczności grafu

0

Witajcie,
Jako że jestem nowy na forum przywitam się na wstępie :) Zaczynam przygodę z programowaniem praktycznie od 0 (ostatni raz na studiach jakieś 10 lat temu miałem Javę ;)), stąd prośba o pomoc.
Muszę napisać program, który wczytuje z pliku graf, a następnie sprawdzam czy jest cykliczny (resztę zadania na razie pomijam).
O ile z samym wczytywaniem grafu z pliku i podstawowymi operacjami na nim, poradziłem sobie, o tyle nie mogę sobie poradzić z przeglądem i klasyfikacją wierzchołków, kod poniżej. Algorytm DFS.

import networkx as nx

G = nx.Graph()

#print("Podaj nazwe pliku tesktowego z rozszerzeniem: ")
#nazwa_pliku = input()

nazwa_pliku = 'graf.txt'

G = nx.read_edgelist(nazwa_pliku,create_using=nx.Graph(),nodetype=int)


def czy_cykliczny(G):
    lista_odwiedzonych_w = []                                   # Tworzymy pustą listę wierzcholkow
    for i in range(1, G.number_of_nodes() + 1):
            lista_odwiedzonych_w.insert(i, 'false')             # Ustawiamy wszystkie elementy tablicy na 'false'
            
    stos_w = []                                                 # Tworzymy pusty stos
    stos_w.append(1)                                            # Na stosie umieszczamy numer wierzchołka startowego
    stos_w.append(0)                                            # Na stosie umieszczamy numer wierzchołka, z którego przyszliśmy, 0 = żaden
    lista_odwiedzonych_w.insert(0, 'true')                      # Oznaczamy wierzchołek (pierwszy) wyjsciowy jako odwiedzony
    
    while len(stos_w) != 0:     
        w = stos_w.pop()                                        # Usuwa element z wierzchu stosu i przypisuje go do w (wierzchołek, z którego przyszliśmy)    
        v = stos_w.pop()                                        # Usuwa element z wierzchu stosu i przypisuje go do v (wierzchołek bieżący)
        #print(stos_w)
        sasiedzi_lista = ([n for n in G.neighbors(v)])          # Tworzymy listę sąsiadów danego wierzchołka

        for element in sasiedzi_lista:  
            if lista_odwiedzonych_w[element] == 'false':        # Sprawdzamy czy aktualnie sprawdzany sąsiad v był już odwiedzany
                #print(stos_w)
                stos_w.append(element)                          # Jeżeli nie, dodajemy tego sąsiada na wierzch stosu
                stos_w.append(v)                                # Odkładamy wierchołek bieżący na wierzch stosu
                lista_odwiedzonych_w.insert(element, 'true')    # Oznaczamy na liście, że sąsiad v został odwiedziny 
            elif element != w:                                  # Jeśli trafiamy na odwiedzony wierzchołek z którego nie przyszliśmy to graf jest cykliczny
                print("Graf jest cykliczny.")
                break
            else:                                               # Jeśli nigdzie nie trafiliśmy na odwiedzony wcześniej wierzchołek
                print("Graf nie jest cykliczny.")
                break
                     
    return


czy_cykliczny(G)

Przepraszam za rozwlekłe komentarze... ;)
Zawartość pliku 'graf.txt' poniżej. Graf (cykliczny) w postaci listy powiązanych krawędzią wierzchołków w każdym wierszu.

1 2
2 3
3 4
1 4
2 4
0

Opisz, co jest nie tak.

0
enedil napisał(a):

Opisz, co jest nie tak.

Wynik dla grafu cyklicznego z pliku graf.txt:

Graf nie jest cykliczny.
Graf jest cykliczny.
Graf nie jest cykliczny.
Graf jest cykliczny.
Graf nie jest cykliczny.
0

lista.insert(indeks, wartość) nie działa tak jak myślisz. Sprawdź sobie w interpreterze, co się dzieje, jak zrobisz

lista = [1, 2, 3]
lista.insert(1, "coś")

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