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