prim.py (2694B)
1 import pygame 2 import heapq 3 import random 4 import math 5 6 pygame.init() 7 8 display = pygame.display.set_mode((5120,1440)) 9 10 VERTICES = 1000 11 EDGES = 10000 12 13 white = (255, 255, 255) 14 red = (255, 0, 0) 15 black = (0, 0, 0) 16 grey = (100,100,100) 17 light_grey = (50,50,50) 18 19 20 class Vertex(): 21 def __init__(self, x, y): 22 self.x = x 23 self.y = y 24 self.visited = False 25 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 32 class Edge(): 33 def __init__(self, v1, v2): 34 self.v1 = v1 35 self.v2 = v2 36 self.dist = math.sqrt(((v1.x - v2.x) ** 2) + ((v1.y - v2.y) ** 2)) 37 38 def draw_edge(self,display, c): 39 pygame.draw.line(display, c, (self.v1.x,self.v1.y), (self.v2.x,self.v2.y), 1) 40 41 def __lt__(self,otr): 42 return self.dist < otr.dist 43 44 45 graph = {} 46 47 for i in range(0,VERTICES): 48 x = random.random() * 5120 49 y = random.random() * 1440 50 graph[Vertex(x,y)] = [] 51 52 53 edge_list = [] 54 for i in range(0,EDGES): 55 k1 = None 56 k2 = None 57 while k1 == k2: 58 k1 = random.choice(list(graph.keys())) 59 k2 = random.choice(list(graph.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 mst = [] 71 72 start = random.choice(list(graph.keys())) 73 start.visited = True 74 visited_vertices.add(start) 75 for edge in graph[start]: 76 heapq.heappush(edge_heap, edge) 77 78 while True: 79 for event in pygame.event.get(): 80 if event.type == pygame.QUIT: 81 pygame.quit() 82 quit() 83 84 display.fill(black) 85 for edge in edge_list: 86 edge.draw_edge(display, light_grey) 87 for edge in mst: 88 edge.draw_edge(display, white) 89 for vertex in graph: 90 vertex.draw_vertex(display) 91 92 item = None 93 while edge_heap: 94 candidate = heapq.heappop(edge_heap) 95 if (candidate.v1 in visited_vertices) != (candidate.v2 in visited_vertices): 96 item = candidate 97 break 98 99 if item is None: 100 pygame.display.update() 101 break 102 103 new_vertex = item.v2 if item.v1 in visited_vertices else item.v1 104 visited_vertices.add(new_vertex) 105 new_vertex.visited = True 106 mst.append(item) 107 for edge in graph[new_vertex]: 108 heapq.heappush(edge_heap, edge) 109 110 #dir_name = "/dev/shm/bg/" 111 #if not os.path.exists(dir_name): 112 # os.mkdir(dir_name) 113 #pygame.image.save(display, dir_name + "out.png") 114 #os.system("/usr/bin/feh --no-fehbg --bg-tile '/dev/shm/bg/out.png' ") 115 #time.sleep(.1) 116 pygame.display.update()