コード例 #1
0
 def test_exceptions(self):
     self.assertRaises(ValueError, MatchingFordFulkersonSet,
                       Graph(2, directed=True))
     self.assertRaises(ValueError, MatchingFordFulkersonList,
                       Graph(2, directed=True))
     self.assertRaises(ValueError, MatchingFordFulkersonColor,
                       Graph(2, directed=True))
コード例 #2
0
ファイル: test_isetus.py プロジェクト: yjfiejd/graphs-dict
 def test_exceptions(self):
     self.assertRaises(ValueError, UnorderedSequentialIndependentSet1,
                       Graph(5, directed=True))
     self.assertRaises(ValueError, UnorderedSequentialIndependentSet2,
                       Graph(5, directed=True))
     self.assertRaises(ValueError, UnorderedSequentialIndependentSet3,
                       Graph(5, directed=True))
コード例 #3
0
 def test_exceptions(self):
     self.G.add_edge(Edge(0, 4))
     algorithm = BipartiteGraphBFS(self.G)
     self.assertRaises(ValueError, algorithm.run)
     algorithm = BipartiteGraphDFS(self.G)
     self.assertRaises(ValueError, algorithm.run)
     self.assertRaises(ValueError, BipartiteGraphBFS, Graph(2,
                                                            directed=True))
     self.assertRaises(ValueError, BipartiteGraphDFS, Graph(2,
                                                            directed=True))
コード例 #4
0
 def test_exceptions(self):
     self.assertRaises(ValueError, FordFulkerson, Graph())
     self.assertRaises(ValueError, FordFulkersonSparse, Graph())
     self.assertRaises(ValueError, FordFulkersonWithEdges, Graph())
     self.assertRaises(ValueError, FordFulkersonRecursive, Graph())
     self.assertRaises(ValueError, lambda: FordFulkerson(self.G).run(0, 0))
     self.assertRaises(ValueError,
                       lambda: FordFulkersonSparse(self.G).run(0, 0))
     self.assertRaises(ValueError,
                       lambda: FordFulkersonWithEdges(self.G).run(0, 0))
     self.assertRaises(ValueError,
                       lambda: FordFulkersonRecursive(self.G).run(0, 0))
     self.assertRaises(
         ValueError,
         lambda: FordFulkersonRecursiveWithEdges(self.G).run(0, 0))
コード例 #5
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 def test_3prism(self):
     N = 6
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(1, 2),
         Edge(2, 3),
         Edge(3, 4),
         Edge(4, 5),
         Edge(0, 5),
         Edge(1, 4),
         Edge(2, 0),
         Edge(3, 5)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     #print "3prism ..."
     algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 2, 3, 5]))
     #algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 1, 4, 5]))
     #algorithm = HalinGraphTreeDecomposition(G, outer=set([1, 2, 3, 4]))
     algorithm.run()
     #print "3prism outer", algorithm.outer
     parent = {0: 1, 1: None, 2: 1, 3: 4, 4: 1, 5: 4}
     self.assertEqual(algorithm.parent, parent)
     #order = [1, 0, 2, 3, 5, 4]
     order = [4, 0, 2, 3, 5, 1]
     self.assertEqual(algorithm.order, order)
     self.assertEqual(len(algorithm.cliques), G.v() - 3)
コード例 #6
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 def test_halin16(self):
     N = 16
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(0, 2),
         Edge(0, 15),
         Edge(1, 2),
         Edge(1, 6),
         Edge(2, 3),
         Edge(3, 4),
         Edge(3, 5),
         Edge(4, 5),
         Edge(4, 10),
         Edge(5, 6),
         Edge(6, 7),
         Edge(7, 8),
         Edge(7, 15),
         Edge(8, 9),
         Edge(8, 13),
         Edge(9, 10),
         Edge(9, 11),
         Edge(10, 11),
         Edge(11, 12),
         Edge(12, 13),
         Edge(12, 14),
         Edge(13, 14),
         Edge(14, 15)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     #print "halin16 ..."
     algorithm = HalinGraphTreeDecomposition(
         G, outer=set([0, 2, 3, 4, 10, 11, 12, 14, 15]))
     algorithm.run()
     #print "halin16 outer", algorithm.outer
     parent = {
         0: 1,
         1: None,
         2: 1,
         3: 5,
         4: 5,
         5: 6,
         6: 1,
         7: 6,
         8: 7,
         9: 8,
         10: 9,
         11: 9,
         12: 13,
         13: 8,
         14: 13,
         15: 7
     }
     self.assertEqual(algorithm.parent, parent)
     order = [5, 9, 13, 1, 11, 12, 8, 2, 3, 6, 0, 4, 10, 14, 15, 7]
     self.assertEqual(algorithm.order, order)
     self.assertEqual(len(algorithm.cliques), G.v() - 3)
コード例 #7
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 def test_wheel5(self):
     N = 5
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(0, 2),
         Edge(0, 3),
         Edge(0, 4),
         Edge(1, 2),
         Edge(2, 3),
         Edge(3, 4),
         Edge(4, 1)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     #print "wheel5 ..."
     algorithm = HalinGraphTreeDecomposition(G, outer=set([1, 2, 3, 4]))
     algorithm.run()
     #print "wheel5 outer", algorithm.outer
     #print "wheel5 cycle", algorithm.cycle
     parent = {0: None, 1: 0, 2: 0, 3: 0, 4: 0}
     self.assertEqual(algorithm.parent, parent)
     order = [1, 2, 3, 4, 0]
     self.assertEqual(algorithm.order, order)
     self.assertEqual(len(algorithm.cliques), G.v() - 3)
コード例 #8
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 def test_halin8c(self):
     N = 8
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(0, 5),
         Edge(0, 7),
         Edge(1, 2),
         Edge(1, 7),
         Edge(2, 3),
         Edge(2, 6),
         Edge(3, 4),
         Edge(3, 6),
         Edge(4, 5),
         Edge(4, 6),
         Edge(5, 6),
         Edge(6, 7)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     #print "halin8c ..."
     algorithm = HalinGraphTreeDecomposition(G,
                                             outer=set([0, 1, 2, 3, 4, 5]))
     algorithm.run()
     #print "halin8c outer", algorithm.outer
     parent = {0: 7, 1: 7, 2: 6, 3: 6, 4: 6, 5: 6, 6: None, 7: 6}
     self.assertEqual(algorithm.parent, parent)
     #order = [7, 0, 1, 2, 3, 4, 5, 6]   # wersja z indeksami
     order = [3, 4, 6, 0, 1, 2, 5, 7]  # wersja z linkami
     self.assertEqual(algorithm.order, order)
     self.assertEqual(len(algorithm.cliques), G.v() - 3)
コード例 #9
0
ファイル: test_halintd.py プロジェクト: kgashok/graphs-dict
 def test_halin8a(self):
     N = 8
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(0, 2),
         Edge(0, 7),
         Edge(1, 2),
         Edge(1, 5),
         Edge(2, 3),
         Edge(3, 4),
         Edge(3, 7),
         Edge(4, 5),
         Edge(4, 6),
         Edge(5, 6),
         Edge(6, 7)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     #print "halin8a ..."
     algorithm = HalinGraphTreeDecomposition(G, outer=set([0, 7, 6, 5, 1]))
     algorithm.run()
     #print "halin8a outer", algorithm.outer
     parent = {0: 2, 1: 2, 2: None, 3: 2, 4: 3, 5: 4, 6: 4, 7: 3}
     self.assertEqual(algorithm.parent, parent)
     #order = [2, 4, 0, 1, 5, 6, 7, 3]
     order = [4, 2, 0, 1, 5, 6, 7, 3]
     self.assertEqual(algorithm.order, order)
     self.assertEqual(len(algorithm.cliques), G.v() - 3)
コード例 #10
0
ファイル: test_connected.py プロジェクト: yjfiejd/graphs-dict
 def test_scc(self):
     algorithm = StronglyConnectedComponents(self.G)
     algorithm.run()
     self.assertEqual(algorithm.n_scc, self.expected_n_scc)
     self.assertEqual(algorithm.scc, self.expected_scc)
     self.assertRaises(ValueError, StronglyConnectedComponents,
                       Graph(1, False))
コード例 #11
0
 def test_wheel5(self):
     N = 5
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(0, 2),
         Edge(0, 3),
         Edge(0, 4),
         Edge(1, 2),
         Edge(2, 3),
         Edge(3, 4),
         Edge(4, 1)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     algorithm = HalinNodeColoring(G, outer=set([1, 2, 3, 4]))
     algorithm.run()
     #print "wheel5 outer", algorithm.outer
     #print "wheel5 cycle", algorithm.cycle
     parent = {0: None, 1: 0, 2: 0, 3: 0, 4: 0}
     self.assertEqual(algorithm.parent, parent)
     for node in G.iternodes():
         self.assertNotEqual(algorithm.color[node], None)
     for edge in G.iteredges():
         self.assertNotEqual(algorithm.color[edge.source],
                             algorithm.color[edge.target])
     all_colors = set(algorithm.color[node] for node in G.iternodes())
     self.assertEqual(len(all_colors), 3)
コード例 #12
0
 def test_center_two2(self):
     T = Graph(2)
     T.add_edge(Edge(0, 1))
     algorithm = TreeCenter(T)
     algorithm.run()
     self.assertEqual(algorithm.tree_center, [0, 1])
     self.assertEqual(algorithm.tree_radius, 1)
コード例 #13
0
 def setUp(self):
     self.N = 5
     self.G = Graph(self.N)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1),
         Edge(0, 2),
         Edge(1, 2),
         Edge(1, 3),
         Edge(1, 4)
     ]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
     #self.G.show()
     node1 = Node(0, 1, "edge")
     node2 = Node(0, 2, "edge")
     node3 = Node(2, 1, "edge")
     node4 = Node(1, 3, "edge")
     node5 = Node(1, 4, "edge")
     node6 = Node(0, 1, "series", node2, node3)
     node7 = Node(0, 1, "parallel", node1, node6)
     node8 = Node(0, 1, "jackknife", node7, node4)
     node9 = Node(0, 1, "jackknife", node8, node5)
     self.root = node9
コード例 #14
0
ファイル: test_prim.py プロジェクト: yjfiejd/graphs-dict
 def setUp(self):
     # The modified graph (unique weights) from Cormen.
     self.N = 9  # number of nodes
     self.G = Graph(self.N)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1, 4),
         Edge(0, 7, 8),
         Edge(1, 7, 11),
         Edge(1, 2, 12),
         Edge(7, 8, 7),
         Edge(8, 2, 2),
         Edge(8, 6, 6),
         Edge(7, 6, 1),
         Edge(2, 3, 13),
         Edge(2, 5, 5),
         Edge(6, 5, 3),
         Edge(3, 5, 14),
         Edge(3, 4, 9),
         Edge(5, 4, 10)
     ]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #15
0
 def test_3prism(self):
     N = 6
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(1, 2),
         Edge(2, 3),
         Edge(3, 4),
         Edge(4, 5),
         Edge(0, 5),
         Edge(1, 4),
         Edge(2, 0),
         Edge(3, 5)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     #print "3prism"
     algorithm = HalinNodeColoring(G, outer=set([0, 2, 3, 5]))
     #algorithm = HalinNodeColoring(G, outer=set([0, 1, 4, 5]))
     #algorithm = HalinNodeColoring(G, outer=set([1, 2, 3, 4]))
     algorithm.run()
     #print "3prism outer", algorithm.outer
     parent = {0: 1, 1: None, 2: 1, 3: 4, 4: 1, 5: 4}
     self.assertEqual(algorithm.parent, parent)
     for node in G.iternodes():
         self.assertNotEqual(algorithm.color[node], None)
     for edge in G.iteredges():
         self.assertNotEqual(algorithm.color[edge.source],
                             algorithm.color[edge.target])
     all_colors = set(algorithm.color[node] for node in G.iternodes())
     self.assertEqual(len(all_colors), 3)
コード例 #16
0
def make_random_spgraph(n):
    """Make a series-parallel graph with n vertices."""
    if n < 2:
        raise ValueError("bad n")
    graph = Graph(n)
    for node in xrange(n):
        graph.add_node(node)
    source = 0
    sink = n - 1
    edge_list = [Edge(source, sink)]
    node = n - 2
    while node > 0:
        # Losowanie krawedzi na ktorej bedzie operacja.
        i = random.randrange(0, len(edge_list))
        swap(edge_list, i, -1)
        edge = edge_list[-1]
        # Losowanie operacji.
        if edge.target == sink:
            action = random.choice(["series", "parallel", "jackknife"])
        else:
            action = random.choice(["series", "parallel"])
        if action == "series":
            edge_list.pop()
            edge_list.append(Edge(edge.source, node))
            edge_list.append(Edge(node, edge.target))
        elif action == "parallel":
            edge_list.append(Edge(edge.source, node))
            edge_list.append(Edge(node, edge.target))
        elif action == "jackknife":
            edge_list.append(Edge(edge.target, node))
        node -= 1
    for edge in edge_list:
        graph.add_edge(edge)
    return graph
コード例 #17
0
ファイル: test_connected.py プロジェクト: yjfiejd/graphs-dict
 def setUp(self):
     self.N = 8  # number of nodes
     self.G = Graph(self.N, directed=True)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1),
         Edge(1, 4),
         Edge(4, 0),
         Edge(4, 5),
         Edge(1, 5),
         Edge(1, 2),
         Edge(5, 6),
         Edge(6, 5),
         Edge(2, 6),
         Edge(2, 3),
         Edge(3, 2),
         Edge(6, 7),
         Edge(3, 7)
     ]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
     #self.G.show()
     self.expected_scc = {0: 0, 1: 0, 2: 1, 3: 1, 4: 0, 5: 2, 6: 2, 7: 3}
     self.expected_n_scc = 4
コード例 #18
0
 def test_halin8c(self):
     N = 8
     G = Graph(N, False)
     edges = [
         Edge(0, 1),
         Edge(0, 5),
         Edge(0, 7),
         Edge(1, 2),
         Edge(1, 7),
         Edge(2, 3),
         Edge(2, 6),
         Edge(3, 4),
         Edge(3, 6),
         Edge(4, 5),
         Edge(4, 6),
         Edge(5, 6),
         Edge(6, 7)
     ]
     for node in range(N):
         G.add_node(node)
     for edge in edges:
         G.add_edge(edge)
     algorithm = HalinNodeColoring(G, outer=set([0, 1, 2, 3, 4, 5]))
     algorithm.run()
     #print "halin8c outer", algorithm.outer
     parent = {0: 7, 1: 7, 2: 6, 3: 6, 4: 6, 5: 6, 6: None, 7: 6}
     self.assertEqual(algorithm.parent, parent)
     for node in G.iternodes():
         self.assertNotEqual(algorithm.color[node], None)
     for edge in G.iteredges():
         self.assertNotEqual(algorithm.color[edge.source],
                             algorithm.color[edge.target])
     all_colors = set(algorithm.color[node] for node in G.iternodes())
     self.assertEqual(len(all_colors), 3)
コード例 #19
0
 def test_exceptions(self):
     self.assertRaises(ValueError, BipartiteGraphEdgeColoring,
                       Graph(5, directed=True))
     gf = GraphFactory(Graph)
     G = gf.make_cyclic(4)
     #G.show()
     G.add_edge(Edge(0, 2))  # nie bedzie dwudzielny
     self.assertRaises(ValueError, BipartiteGraphEdgeColoring, G)
コード例 #20
0
 def test_exceptions(self):
     self.assertRaises(ValueError, CompleteBipartiteGraphEdgeColoring,
                       Graph(5, directed=True))
     gf = GraphFactory(Graph)
     G = gf.make_bipartite(2, 2, False, 1)
     #G.show()
     G.del_edge(Edge(0, 2))  # nie bedzie pelny dwudzielny
     self.assertRaises(ValueError, CompleteBipartiteGraphEdgeColoring, G)
コード例 #21
0
ファイル: test_treeplot.py プロジェクト: kgashok/graphs-dict
 def test_tree_three_nodes(self):
     T = Graph(3)
     for node in (0, 1, 2):
         T.add_node(node)
     for edge in (Edge(0, 1), Edge(1, 2)):
         T.add_edge(edge)
     algorithm = TreePlot(T)
     algorithm.run()
     self.assertEqual(len(algorithm.point_dict), 3)
コード例 #22
0
 def test_add_graph_undirected(self):
     T = Graph(self.N)
     for node in self.nodes:
         T.add_node(node)
     T.add_edge(Edge("A", "D", 9))
     self.assertEqual(T.v(), self.N)
     self.assertEqual(T.e(), 1)
     self.G.add_graph(T)
     self.assertEqual(self.G.v(), self.N)
     self.assertEqual(self.G.e(), 6)
コード例 #23
0
ファイル: test_treecover.py プロジェクト: yjfiejd/graphs-dict
 def setUp(self):
     self.N = 7
     self.G = Graph(self.N)
     self.nodes = range(self.N)
     self.edges = [Edge(0, 1), Edge(1, 3), Edge(1, 2), 
         Edge(1, 4), Edge(2, 5), Edge(2, 6)]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #24
0
    def test_dijkstra_for_path_not_found(self):
        print("Testing Matrix 2nd time")
        self.N = 8  # number of nodes
        self.G = Graph(self.N, directed=True)
        self.nodes = range(self.N)
        self.edges = [
            Edge(0, 1, 65),
            Edge(1, 8, 41),
            Edge(1, 2, 35),
            Edge(2, 3, 56),
            Edge(3, 4, 4),
            Edge(3, 6, 20),
            Edge(5, 2, 30),
            Edge(6, 5, 18),
            Edge(6, 7, 15),
            Edge(8, 3, 28)
        ]
        for node in self.nodes:
            self.G.add_node(node)
        for edge in self.edges:
            self.G.add_edge(edge)
        # self.G.show()

        algorithm = Dijkstra(self.G)
        source = 0
        algorithm.run(source)

        target = 7
        path_expected = [0, 1, 8, 3, 6, 7]
        distance_expected = 169
        self.assertEqual(path_expected, algorithm.path(target))
        self.assertEqual(distance_expected, algorithm.distance[target])

        algorithm2 = DijkstraMatrix(self.G)
        algorithm2.run(source)
        self.assertEqual(path_expected, algorithm.path(target))
        self.assertEqual(distance_expected, algorithm.distance[target])

        source = 2
        target = 8
        algorithm.run(source)
        try:
            algorithm.path(target)
        except:
            pass
        else:
            self.fail("Path exception was not raised!")

        algorithm2.run(source)
        try:
            algorithm2.path(target)
        except:
            pass
        else:
            self.fail("Path exception was not raised!")
コード例 #25
0
 def setUp(self):
     self.N = 4           # number of nodes
     self.G = Graph(self.N, directed=True) # directed graph
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1, 1), Edge(0, 2, 5), Edge(1, 2, 1), Edge(1, 3, 3), 
         Edge(2, 3, 1)]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #26
0
ファイル: test_euler.py プロジェクト: kgashok/graphs-dict
 def setUp(self):
     self.N = 7           # number of nodes
     self.G = Graph(self.N, directed=False)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1), Edge(0, 4), Edge(1, 4), Edge(2, 3), Edge(2, 5), 
         Edge(3, 5), Edge(4, 5), Edge(4, 6), Edge(5, 6)]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #27
0
ファイル: test_euler.py プロジェクト: kgashok/graphs-dict
 def setUp(self):
     self.N = 6           # number of nodes
     self.G = Graph(self.N, directed=True)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1), Edge(3, 0), Edge(1, 4), Edge(4, 3), Edge(2, 4), 
         Edge(4, 5), Edge(5, 2)]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #28
0
 def setUp(self):
     self.N = 5           # number of nodes
     self.G = Graph(self.N, directed=False)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 2, 6), Edge(0, 3, 3), Edge(1, 0, 3), Edge(2, 3, 2), 
         Edge(3, 1, 1), Edge(4, 1, 4), Edge(4, 3, 2)]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #29
0
 def setUp(self):
     self.N = 4           # number of nodes
     self.G = Graph(self.N, directed=True)
     self.nodes = range(self.N)
     self.edges = [
         Edge(0, 1, 3), Edge(0, 2, 6), Edge(1, 2, 4), Edge(1, 3, 5), 
         Edge(2, 3, 2), Edge(3, 0, -5), Edge(3, 1, -3)]
     for node in self.nodes:
         self.G.add_node(node)
     for edge in self.edges:
         self.G.add_edge(edge)
コード例 #30
0
ファイル: halintools.py プロジェクト: kgashok/graphs-dict
def make_halin_outer(n=4):
    """Create a random weighted Halin graph with the set of outer nodes."""
    if n < 4:
        raise ValueError("number of nodes must be greater than 3")
    graph = Graph(n)
    weights = list(range(1, 1 + 2 * n - 2))
    random.shuffle(weights)
    for node in xrange(n):
        graph.add_node(node)
    # Teraz trzeba dodawac krawedzie, ale nie moze zostac wierzcholek
    # stopnia 2. Startuje od gwiazdy.
    graph.add_edge(Edge(1, 0, weights.pop()))
    graph.add_edge(Edge(2, 0, weights.pop()))
    graph.add_edge(Edge(3, 0, weights.pop()))
    nodes = set([0, 1, 2, 3])
    node = 4
    while node < n:
        parent = random.sample(nodes, 1)[0]
        if graph.degree(parent) == 1:  # leaf, we must add two edges
            if node + 1 == n:
                continue
            nodes.add(node)
            graph.add_edge(Edge(parent, node, weights.pop()))
            node += 1
            nodes.add(node)
            graph.add_edge(Edge(parent, node, weights.pop()))
            node += 1
        else:  # degree > 2
            nodes.add(node)
            graph.add_edge(Edge(parent, node, weights.pop()))
            node += 1
    # Method 1. Finding root without TreeCenter.
    for node in graph.iternodes():
        if graph.degree(node) > 1:  # always present
            root = node
            break
    # Method 2. Finding root with TreeCenter.
    # TreeCenter reduces floating point errors for points.
    #algorithm = TreeCenter(graph)
    #algorithm.run()
    #root = algorithm.tree_center[0]
    # Wyznaczam slownik z punktami.
    algorithm = TreePlotRadiusAngle(graph)
    algorithm.run(root)
    L = list()  # for leafs
    for node in algorithm.point_dict:
        if graph.degree(node) == 1:  # leafs
            L.append(node)
    # Sortowanie lisci ze wzgledu na kat.
    L.sort(key=lambda node: algorithm.point_dict[node][1])
    n_leafs = len(L)
    for i in range(n_leafs):
        graph.add_edge(Edge(L[i], L[(i + 1) % n_leafs], weights.pop()))
    return graph, set(L)