Skip to content

Commit 401ffc4

Browse files
committed
update: testes
1 parent 5ba5705 commit 401ffc4

File tree

6 files changed

+114
-44
lines changed

6 files changed

+114
-44
lines changed

grafo.png

78.7 KB
Loading

grafo1.txt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
5 7
2-
0 1 2
3-
0 3 6
4-
1 2 3
5-
1 3 8
6-
1 4 5
7-
2 4 7
1+
9 14
2+
0 1 4
3+
0 7 8
4+
1 2 8
5+
1 7 11
6+
2 3 7
7+
2 5 4
8+
2 8 2
89
3 4 9
10+
3 5 14
11+
4 5 10
12+
5 6 2
13+
6 7 1
14+
6 8 6
15+
7 8 7

grafoa.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
8 11
2+
0 1 2
3+
0 2 3
4+
1 3 2
5+
2 3 1
6+
3 4 4
7+
3 5 2
8+
4 5 1
9+
4 6 2
10+
4 7 1
11+
5 4 1
12+
5 7 1
13+
5 6 2
14+
6 4 2
15+
6 7 3
16+
7 4 1
17+
7 6 3

grafob.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
11 19
2+
0 1 16
3+
0 2 10
4+
0 3 12
5+
1 4 2
6+
1 5 13
7+
2 3 1
8+
3 6 21
9+
3 4 9
10+
4 5 8
11+
4 6 20
12+
5 6 18
13+
5 7 15
14+
6 7 19
15+
6 8 17
16+
8 7 5
17+
8 10 6
18+
8 9 14
19+
9 10 11

grafoex.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
10 21
2+
0 1 3
3+
0 2 9
4+
0 5 6
5+
1 2 9
6+
1 3 9
7+
1 4 2
8+
1 5 4
9+
2 3 8
10+
2 9 18
11+
3 4 8
12+
3 6 7
13+
3 8 9
14+
3 9 10
15+
4 5 2
16+
4 6 9
17+
5 6 9
18+
6 7 4
19+
6 8 5
20+
7 8 1
21+
7 9 4
22+
8 9 3

prim.py

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,54 @@
33

44
def ler_arquivo(filename):
55
with open(filename, 'r') as file:
6-
linhas = file.readlines() # Lê as linhas do arquivo
6+
linhas = file.readlines()
77

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)]
1510

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+
1616
return n, n_out
1717

1818
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 = []
2121

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))
2424

25-
marcados = [False] * n # Vértices marcados
26-
marcados[raiz] = True # Marca o vértice raiz
25+
marcados = [False] * n
26+
marcados[raiz] = True
2727

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 = []
3131

3232
print(f"\nIniciando o algoritmo a partir da raiz: {raiz}\n")
3333

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+
4040
print(f"\nAnalisando 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)])
4342

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
4943

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
5349

50+
for (x, c) in n_out[b]:
51+
if not marcados[x]:
52+
heapq.heappush(H, (c, b, x))
5453

55-
# Exibe o custo total e a árvore geradora mínima de forma formatada
5654
print(f"Custo Total da Árvore Geradora Mínima: {custo_tot}\n")
5755

5856
print("Arestas da Árvore Geradora Mínima:")
@@ -61,7 +59,14 @@ def prim(n, n_out):
6159

6260
print("\n###### FIM DOS RESULTADOS ######\n")
6361

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:")
6569
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

Comments
 (0)