Advertisement
cyberjab

Untitled

May 25th, 2023
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.19 KB | None | 0 0
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3.  
  4.  
  5. def kruskal(G, make, mx=False):
  6.     if make:
  7.         sp = []
  8.         n = len(G.nodes.items())
  9.         for (u, v, wt) in G.edges.data('weight'):
  10.             sp.append((u, v, wt))
  11.         if not mx:
  12.             sp.sort(key=lambda x: x[2])
  13.             comp = [i for i in range(n)]
  14.             ans = 0
  15.             spp = {}
  16.             x = []
  17.             for start, end, weight in sp:
  18.                 start -= 1
  19.                 end -= 1
  20.                 if comp[start] != comp[end]:
  21.                     ans += weight
  22.                     a = comp[start]
  23.                     b = comp[end]
  24.                     for i in range(n):
  25.                         if comp[i] == b:
  26.                             comp[i] = a
  27.                     spp[(start + 1, end + 1)] = weight
  28.                     x.append((start + 1, end + 1))
  29.             return spp, ans, x
  30.         else:
  31.             sp.sort(key=lambda x: -x[2])
  32.             comp = [i for i in range(n)]
  33.             ans = 0
  34.             spp = {}
  35.             x = []
  36.             for start, end, weight in sp:
  37.                 start -= 1
  38.                 end -= 1
  39.                 if comp[start] != comp[end]:
  40.                     ans += weight
  41.                     a = comp[start]
  42.                     b = comp[end]
  43.                     for i in range(n):
  44.                         if comp[i] == b:
  45.                             comp[i] = a
  46.                     spp[(start + 1, end + 1)] = weight
  47.                     x.append((start + 1, end + 1))
  48.             return spp, ans, x
  49.     return (0, 0, 0)
  50.  
  51.  
  52. G = nx.Graph()
  53. make_graph = True
  54. with open("inputkr.txt") as f:
  55.     sp = f.readlines()
  56.     n, m = [int(x) for x in sp[0].strip().split()]
  57.     check = len(sp)
  58.     node_sp = [i for i in range(1, n + 1)]
  59.     n_cnt = 0
  60.     m_cnt = 0
  61.     for i in range(1, check):
  62.         s = [int(x) for x in sp[i].strip().split()]
  63.         if i >= n + 1:
  64.             for i in range(len(s)):
  65.                 if s[i] not in node_sp and i < 2:
  66.                     make_graph = False
  67.                     print("Введена несуществующая вершина")
  68.         if len(s) == 2:
  69.             n_cnt += 1
  70.         if len(s) == 3:
  71.             m_cnt += 1
  72.     if n_cnt < n:
  73.         print("Введены не все вершины")
  74.         make_graph = False
  75.     if n_cnt > n:
  76.         print("Введено больше вершин чем указано")
  77.         make_graph = False
  78.     if m_cnt < m:
  79.         print("Введены не все ребра")
  80.         make_graph = False
  81.     if m_cnt > m:
  82.         print("Введено больше ребер чем указано")
  83.         make_graph = False
  84.     if make_graph:
  85.         for i in range(1, n + 1):
  86.             posx, posy = [int(x) for x in sp[i].strip().split()]
  87.             G.add_node(i, pos=(posx, posy))
  88.         for i in range(n + 1, check):
  89.             first_point, second_point, w = [int(x) for x in sp[i].strip().split()]
  90.             G.add_edge(first_point, second_point, weight=w)
  91.  
  92. # G.add_node(1, pos=(0, 4))
  93. # G.add_node(2, pos=(2, 3))
  94. # G.add_node(3, pos=(4, 0))
  95. # G.add_node(4, pos=(2, -3))
  96. # G.add_node(5, pos=(0, -4))
  97. # G.add_node(6, pos=(-3, -2))
  98. # G.add_node(7, pos=(-4, 0))
  99. # G.add_node(8, pos=(-3, 2))
  100. #
  101. # G.add_edge(1, 2, weight=2)
  102. # G.add_edge(1, 8, weight=1)
  103. #
  104. # G.add_edge(2, 4, weight=1)
  105. # G.add_edge(2, 6, weight=3)
  106. # G.add_edge(2, 8, weight=3)
  107. #
  108. # G.add_edge(3, 4, weight=2)
  109. # G.add_edge(3, 7, weight=6)
  110. #
  111. # G.add_edge(4, 5, weight=2)
  112. # G.add_edge(4, 8, weight=3)
  113. #
  114. # G.add_edge(5, 6, weight=1)
  115.  
  116. sp, ans, spp = kruskal(G, make_graph)
  117.  
  118. if make_graph:
  119.     pos = nx.get_node_attributes(G, 'pos')
  120.     labels = nx.get_edge_attributes(G, 'weight')
  121.  
  122.     nx.draw(G, pos, with_labels=True, font_weight='bold', font_color="white", font_size=14)
  123.     nx.draw_networkx_nodes(G, pos, node_size=400, node_color="black")
  124.  
  125.     nx.draw_networkx_edges(G, pos, edge_color="blue", edgelist=spp)
  126.     nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, font_size=16)
  127.     nx.draw_networkx_edge_labels(G, pos, edge_labels=sp, font_color="blue", font_size=16)
  128.  
  129.     plt.show()
  130. else:
  131.     print("Граф задан некорректно")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement