Advertisement
cmiN

mst

Jan 21st, 2013
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.66 KB | None | 0 0
  1. #! /usr/bin/env python
  2.  
  3.  
  4. import sys
  5.  
  6.  
  7. def check(edge, cycles):
  8.     if cycles[edge[0]] == cycles[edge[1]]:
  9.         return False    # creeaza ciclu
  10.     return True    # uneste apm-uri diferite
  11.  
  12.  
  13. def update(edge, cycles):
  14.     # Fiecare nod ce are eticheta mare
  15.     # primeste eticheta mica, unde etichetele
  16.     # se determina din capetele muchiei introduse.
  17.  
  18.     little = min(cycles[edge[0]], cycles[edge[1]])
  19.     big = max(cycles[edge[0]], cycles[edge[1]])
  20.  
  21.     for item in cycles.iteritems():
  22.         if item[1] == big:
  23.             cycles[item[0]] = little
  24.  
  25.  
  26. def kruskal(edges):
  27.     # sortam muchiile
  28.     edgesKeys = sorted(edges, reverse=True,
  29.                        key=lambda arg: edges[arg])
  30.  
  31.     # cream structura de ciclicitate
  32.     cycles = dict()
  33.     for edge in edgesKeys:
  34.         cycles[edge[0]] = edge[0]
  35.         cycles[edge[1]] = edge[1]
  36.  
  37.     apm = dict()
  38.     for edge in edgesKeys:
  39.         if not check(edge, cycles):
  40.             continue    # creeaza ciclu
  41.         # o selectam
  42.         apm[edge] = edges[edge]
  43.         update(edge, cycles)
  44.  
  45.     return apm
  46.  
  47.  
  48. def main(argc, argv):
  49.     if argc < 4 or (argc - 1) % 3:
  50.         print "Usage: %s (NODEA NODEB COST)..." % argv[0]
  51.         return 0
  52.  
  53.     edges = dict()
  54.     for i in xrange(1, argc, 3):
  55.         edges[(int(argv[i]), int(argv[i + 1]))] = float(argv[i + 2])
  56.  
  57.     apm = kruskal(edges)
  58.     totalCost = sum(apm.itervalues())
  59.     print "Cost total: %.2f" % totalCost
  60.     print "Muchiile: %s" % ", ".join(["%d %d" % edge\
  61.                                       for edge in apm.iterkeys()])
  62.  
  63.     return 0
  64.  
  65.  
  66. if __name__ == "__main__":
  67.     sys.exit(main(len(sys.argv), sys.argv))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement