3
3
4
4
def ler_arquivo (filename ):
5
5
with open (filename , 'r' ) as file :
6
- linhas = file .readlines () # Lê as linhas do arquivo
6
+ linhas = file .readlines ()
7
7
8
- n , m = map (int , linhas [0 ].split ()) # Número de vértices e arestas
9
- n_out = [[] for _ in range (n )] # Lista de adjacência
10
-
11
- for linha in linhas [1 :]: # Para cada linha do arquivo
12
- a , b , c = map (int , linha .split ()) # Vértice de origem, vértice de destino e custo
13
- n_out [a ].append ((b , c )) # Adiciona a aresta na lista de adjacência
14
- n_out [b ].append ((a , c )) # Adiciona a aresta na lista de adjacência
8
+ n , m = map (int , linhas [0 ].split ())
9
+ n_out = [[] for _ in range (n )]
15
10
11
+ for linha in linhas [1 :]:
12
+ a , b , c = map (int , linha .split ())
13
+ n_out [a ].append ((b , c ))
14
+ n_out [b ].append ((a , c ))
15
+
16
16
return n , n_out
17
17
18
18
def prim (n , n_out ):
19
- raiz = random .randint (0 , n - 1 ) # Vértice raiz
20
- H = [] # Heap
19
+ raiz = random .randint (0 , n - 1 )
20
+ H = []
21
21
22
- for (x , c ) in n_out [raiz ]: # Para cada aresta (x, c) que sai da raiz
23
- heapq .heappush (H , (c , raiz , x )) # Adiciona as arestas que saem da raiz na heap
22
+ for (x , c ) in n_out [raiz ]:
23
+ heapq .heappush (H , (c , raiz , x ))
24
24
25
- marcados = [False ] * n # Vértices marcados
26
- marcados [raiz ] = True # Marca o vértice raiz
25
+ marcados = [False ] * n
26
+ marcados [raiz ] = True
27
27
28
- n_edge = 0 # Número de arestas
29
- custo_tot = 0 # Custo total
30
- arv_ger_mim = [] # Árvore geradora mínima
28
+ n_edge = 0
29
+ custo_tot = 0
30
+ arv_ger_mim = []
31
31
32
32
print (f"\n Iniciando o algoritmo a partir da raiz: { raiz } \n " )
33
33
34
- while n_edge < n - 1 : # Enquanto não tiver n - 1 arestas
35
- while True : # Enquanto não encontrar uma aresta válida
36
- c , a , b = heapq .heappop (H ) # Remove a aresta de menor custo
37
- if not marcados [b ]: # Se o vértice b não foi marcado
38
- break # Sai do loop
39
- # Aresta analisada
34
+ while n_edge < n - 1 :
35
+ while True :
36
+ c , a , b = heapq .heappop (H )
37
+ if not marcados [b ]:
38
+ break
39
+
40
40
print (f"\n Analisando aresta: { a } --({ c } )--> { b } " )
41
- print ("Vértices marcados: " , ["X" if marcados [i ] else str (i ) for i in range (n )])
42
-
41
+ print ("Vértices marcados: " , ["X" if marcados [i ] else str (i ) for i in range (n )])
43
42
44
- marcados [b ] = True # Marca o vértice b
45
- custo_tot += c # Incrementa o custo total
46
- print ("\n ###### RESULTADOS ######" )
47
- arv_ger_mim .append ((a , b )) # Adiciona a aresta na árvore geradora mínima
48
- n_edge += 1 # Incrementa o número de arestas
49
43
50
- for (x , c ) in n_out [b ]: # Para cada aresta (x, c) que sai de b
51
- if not marcados [x ]: # Se o vértice não foi marcado
52
- heapq .heappush (H , (c , b , x )) # Adiciona a aresta na heap
44
+ marcados [b ] = True
45
+ custo_tot += c
46
+ print ("\n ###### RESULTADOS ######" )
47
+ arv_ger_mim .append ((a , b ))
48
+ n_edge += 1
53
49
50
+ for (x , c ) in n_out [b ]:
51
+ if not marcados [x ]:
52
+ heapq .heappush (H , (c , b , x ))
54
53
55
- # Exibe o custo total e a árvore geradora mínima de forma formatada
56
54
print (f"Custo Total da Árvore Geradora Mínima: { custo_tot } \n " )
57
55
58
56
print ("Arestas da Árvore Geradora Mínima:" )
@@ -61,7 +59,14 @@ def prim(n, n_out):
61
59
62
60
print ("\n ###### FIM DOS RESULTADOS ######\n " )
63
61
64
- print ("Digite o nome do arquivo de entrada:" ) # Pede o nome do arquivo de entrada
62
+
63
+ def imprimir_lista_adjacencia (n_out ):
64
+ print ("\n ### Lista de Adjacência ###" )
65
+ for a , b in enumerate (n_out ):
66
+ print (f"Vértice { a } -> { b } " )
67
+
68
+ print ("Digite o nome do arquivo de entrada:" )
65
69
filename = input ()
66
- n , n_out = ler_arquivo (filename ) # Lê o arquivo de entrada
67
- prim (n , n_out ) # Executa o algoritmo de Prim
70
+ n , n_out = ler_arquivo (filename )
71
+ imprimir_lista_adjacencia (n_out )
72
+ prim (n , n_out )
0 commit comments