prim.py (2844B)
1 import pygame 2 import heapq 3 import random 4 import math 5 import time 6 7 pygame.init() 8 9 display = pygame.display.set_mode((5120,1440)) 10 11 VERTICES = 100000 12 EDGES = 1000000 13 14 white = (255, 255, 255) 15 red = (255, 0, 0) 16 black = (0, 0, 0) 17 grey = (100,100,100) 18 light_grey = (50,50,50) 19 20 21 class Vertex(): 22 def __init__(self, x, y): 23 self.x = x 24 self.y = y 25 self.visited = False 26 def draw_vertex(self,display): 27 if self.visited: 28 pygame.draw.circle(display, white, (self.x,self.y), 5) 29 else: 30 pygame.draw.circle(display, grey, (self.x,self.y), 5) 31 class Edge(): 32 def __init__(self, v1, v2): 33 self.v1 = v1 34 self.v2 = v2 35 self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2)) 36 def draw_edge(self,display, c): 37 pygame.draw.line(display, c, (self.v1.x,self.v1.y), (self.v2.x,self.v2.y), 1) 38 39 def __lt__(self,otr): 40 return self.dist < otr.dist 41 42 43 graph = {} 44 45 for i in range(0,VERTICES): 46 x = random.random() * 5120 47 y = random.random() * 1440 48 graph[Vertex(x,y)] = [] 49 50 51 edge_list = [] 52 keys = list(graph.keys()) 53 54 for i in range(0,EDGES): 55 k1 = None 56 k2 = None 57 while k1 == k2: 58 k1 = random.choice(keys) 59 k2 = random.choice(keys) 60 61 edge = Edge(k1,k2) 62 graph[k1].append(edge) 63 graph[k2].append(edge) 64 edge_list.append(edge) 65 66 67 edge_heap = [] 68 visited_vertices = set() 69 70 71 start = random.choice(keys) 72 start.visited = True 73 visited_vertices.add(start) 74 for edge in graph[start]: 75 heapq.heappush(edge_heap, edge) 76 77 78 first = True 79 80 to_draw_vert = [] 81 to_draw_edge = [] 82 83 while True: 84 start = time.monotonic() 85 for event in pygame.event.get(): 86 if event.type == pygame.QUIT: 87 pygame.quit() 88 quit() 89 90 if first: 91 display.fill(black) 92 93 for edge in edge_list: 94 edge.draw_edge(display, light_grey) 95 first = False 96 97 for vertex in graph: 98 vertex.draw_vertex(display) 99 100 for edge in to_draw_edge: 101 edge.draw_edge(display, white) 102 for vert in to_draw_vert: 103 vert.draw_vertex(display) 104 105 to_draw_vert = [] 106 to_draw_edge = [] 107 108 109 item = None 110 while edge_heap: 111 candidate = heapq.heappop(edge_heap) 112 if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices): 113 item = candidate 114 break 115 116 if item is None: 117 break 118 119 new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 120 visited_vertices.add(new_vertex) 121 new_vertex.visited = True 122 123 to_draw_vert.append(new_vertex) 124 to_draw_edge.append(item) 125 126 for edge in graph[new_vertex]: 127 if not edge.v1 in visited_vertices or not edge.v2 in visited_vertices: 128 heapq.heappush(edge_heap, edge) 129 130 pygame.display.update() 131 end = time.monotonic() 132 print(end - start)