# Formát vstupu # ------------- # # N M # počet vrcholů a hran # a1 b1 t1 # popis jedné hrany: krajní vrcholy (0 až N-1) a tloušťka # ... # a_M b_M t_M # # Ukázkový vstup (odpovídá obrázku ze zadání, A=0, ..., E=4): # -------------- # # 5 7 # 3 1 1 # 1 2 1 # 3 4 2 # 2 0 2 # 0 1 3 # 2 3 3 # 4 0 3 # # Ukázkový výstup (odpovídá odebrání v pořadí CA, DB, BC) # --------------- # # 2 0 2 # 3 1 1 # 1 2 1 E = [] N, M = map(int, input().split()) for i in range(M): a,b,t = map(int, input().split()) E.append((t,a,b)) # tloušťka jako první, pro řazení ### Nalezení maximální kostry Kruskalovým algoritmem ### ### http://ksp.mff.cuni.cz/kucharky/minimalni-kostry/ ### E.sort(reverse=True) # seřadíme od nejtlustější parent = [-1] * N # předek v DFU stromu rank = [0] * N kostra = [False] * M # je i-tá hrana v kostře? ## DFU operace def root(u): r = u while parent[r] != -1: r = parent[r] while parent[u] != -1: # komprese cest par = parent[u] parent[u] = r u = par return r def union(r1, r2): if rank[r1] == rank[r2]: parent[r1] = r2 rank[r2] += 1 elif rank[r1] < rank[r2]: parent[r1] = r2 else: parent[r2] = r1 for idx, (t,a,b) in enumerate(E): r_a = root(a) r_b = root(b) if r_a != r_b: union(r_a, r_b) kostra[idx] = True ### Odpojíme dráty mimo kostru, v libovolném pořadí ### for idx, (t,a,b) in enumerate(E): if not kostra[idx]: print(a,b,t)