-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHierholzer.py
44 lines (36 loc) · 1.29 KB
/
Hierholzer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'''
Determinarea unui ciclu eulerian într-un graf conex (sau un
graf conex+ vârfuri izolate) cu toate vârfurile de grad par
O(m)
'''
def Circuit():
global graf, n
nr_muchii= dict()#dictionar cu gradele nodurilor
for i in range(n):
nr_muchii[i] = len(graf[i])
#stiva cu noduri
curent = []
# vector pentru circuit
circuit = []
#incep de la nodul 0
curent.append(0)
nod_curent = 0
while len(curent):
if nr_muchii[nod_curent]!=0:#daca a mai ramaas vreo muchie
curent.append(nod_curent)#adaug nodul
# retin urmatorul nod, pt ca urmeaza sa sterg muchia
nod_urm = graf[nod_curent][-1]
nr_muchii[nod_curent] -= 1 #scad nr de muchii
graf[nod_curent].pop() #scod nodul(auto muchia)
nod_curent = nod_urm #trec la urmatorul nod
else:
circuit.append(nod_curent)#daca nu a mai ramas nicio muchie
#pot adauga nodul in circuit
nod_curent = curent[-1]#trec la urmatorul nod
curent.pop()
print("Circuitul este: ", circuit)
#folosesc lista de adiacenta
#incep numerotarea de la nodul 0!!
n=7
graf=[[1, 6], [2], [0, 3], [4], [2, 5], [0], [4]]
Circuit()