prim_moho.py
1    # ---------------------------------------------------------------------
2    #
3    # PRIM - algoritmus (mohó algoritmus)
4    #
5    # ---------------------------------------------------------------------
6    
7    graph = {0: [(1, 10), (2, 4), (4, 6), (5, 8)],
8             1: [(0, 10), (2, 5), (4, 6)],
9             2: [(0, 4), (1, 5), (3, 4), (4, 9), (7, 3)],
10            3: [(2, 4), (4, 6), (7, 4)],
11            4: [(0, 6), (1, 6), (2, 9), (3, 6), (5, 12), (6, 1), (7, 13)],
12            5: [(0, 8), (4, 12)],
13            6: [(4, 1), (7, 2)],
14            7: [(2, 3), (3, 4), (4, 13), (6, 2)]}
15   mátrix = []
16   csúcs = set()
17   for i in range(len(graph)):  # len(graph) most 8, mivel 8 bejegyzés van a szótárban
18       csúcs = csúcs | {i}
19       sor = [1000] * len(graph)  # sor feltöltése 8 ezressel
20   
21       for j in range(len(graph[i])):  # A szótár aktuális bejegyzésének feldolgozása
22           (p, e) = graph[i][j]  # A szótár i. bejegyzésének j. eleme egy számpár
23           sor[p] = e  # p a gráf egy pontja, e az él "súlya" - ezért célszerű a pontokat indexesen megadni (0,1,2...stb)
24       mátrix.append(sor)  # mátrix egy sora megvan
25   
26   print('Csúcsmátrix:')
27   for elem in mátrix:
28       print(elem)
29   
30   # halmazok előkészítése
31   V = csúcs
32   print('Csúcsok: ', V)
33   X = {0}  # X a feszítőfa csúcsait tartalmazza majd, kezdésként 0, a kiinduló pont van benne
34   Y = V - X  # Y a maradék pontok halmaza {1,2,3,4,5,6,7}
35   F = set()  # F a feszítőfa éleinek halmaza lesz, számpárok lesznek benne
36   print('KEZDŐÁLLAPOT')
37   print('Feszítőfa csúcsai:', X)
38   print('Feszítőfa éleinek halmaza: ', F)
39   print('"Maradék" csúcsok: ', Y)
40   print('---------------------------------')
41   
42   
43   def mini():
44       # EZ és AZ alkotta él benne van-e már F-ben?
45       def nincsbenne_F_ben(ez, az):
46           return ((ez, az) not in F) and ((az, ez) not in F)
47   
48       m = 1000
49   
50       X_TEMP = list(X)  # átmenetileg listává alakítom az X halmazt, mert halmazban nincs indexelés
51       Y_TEMP = list(Y)  # ugyanez a helyzet az Y halmazzal is
52       for i in X_TEMP:  # minimumkeresés a mátrixban, úgy hogy az egyik pont a feszítőfa csúcsai közül legyen,
53           for j in Y_TEMP:  # a másik pont a maradékból
54               if nincsbenne_F_ben(i, j) and mátrix[i][j] < m:
55                   # kizárjuk a már feldolgozott éleket (nincsbenne_F_ben(i,j))
56                   m = mátrix[i][j]  # ez az aktuális minimum
57                   kezdőpont = i  # és ez a kezdőpont X-ből
58                   végpont = j  # és ez a végpont Y-ból
59   
60       return (kezdőpont, végpont)
61   
62   
63   while X != V:  # addig tart az ismétlődés (ciklus), amíg minden csúcspontot nem érintettünk
64   
65       (x, y) = mini()
66   
67       X = X | {y}  # a megtalált új csúcspont elhelyezése X-ben (halmazművelet: UNIÓ)
68       print('Feszítőfa csúcsai:', X)
69       F = F | {(x, y)}  # él elhelyezése F-ben (halmazművelet: UNIÓ)
70       print('Feszítőfa éleinek halmaza: ', F)
71       Y = Y - {y}  # csúcspont törlése a maradékból (halmazművelet: KÜLÖNBSÉG)
72       print('"Maradék" csúcsok: ', Y)