#!/usr/bin/python3 # Popis stromu: vrcholy jsou indexované od 0 do n-1, # sousedi[v][i] je i-tý soused vrcholu v n = 7 sousedi = [ [1], [0,2,3,6], [1,4], [1], [2,5], [4], [1] ] # Postupné odtrhávání listů: na sousedství nesaháme, ale v deg[v] si pamatujeme # aktuální stupně vrcholů. V poli listy postupně shromažďujeme čísla listů, # listy[0:i] jsou už otrhané, listy[i:j] zbývají v aktuálni vrstvě, listy[j:] # tvoří následující vrstvu. Konečně otec[v] říká, jakého měl v souseda v okamžiku, # kdy se stal listem. deg = [ len(s) for s in sousedi ] listy = [ v for v in range(n) if deg[v] == 1 ] # první vrstva otec = [ -1 for v in range(n) ] i = 0 pv = 0 # počet vrstev while len(listy) < n: # cyklus přes vrstvy j = len(listy) pv += 1 while i < j: # listy jedné vrstvy v = listy[i] i += 1 deg[v] = -1 # označen jako odtržený for s in sousedi[v]: if deg[s] > 0: otec[v] = s deg[s] -= 1 if deg[s] == 1: listy.append(s) # V poslední vrstvě zbývá centrum stromu. Jeho excentricita je rovna # počtu vrstev. exc = [ 0 for v in range(n) ] for v in listy[i:]: exc[v] = pv # Nyní přilepujeme listy zpátky a počítáme excentricity while i > 0: i -= 1 v = listy[i] exc[v] = exc[otec[v]] + 1 # Nakonec excentricity vypíšeme print(exc)