Exemple #1
0
def graph():

    letters = Graph()

    a = letters.add_node("a")
    b = letters.add_node("b")
    c = letters.add_node("c")
    d = letters.add_node("d")
    e = letters.add_node("e")
    f = letters.add_node("f")
    g = letters.add_node("g")
    h = letters.add_node("h")

    letters.add_edge(a, b)
    letters.add_edge(b, c)
    letters.add_edge(c, g)
    letters.add_edge(a, d)

    letters.add_edge(d, e)
    letters.add_edge(d, h)
    letters.add_edge(d, f)

    letters.add_edge(h, f)

    return letters
Exemple #2
0
def test_bouquet():
    g = Graph()
    apple = g.add_node("apple")
    g.add_edge(apple, apple, 10)
    neighbors = g.get_neighbors(apple)
    assert len(neighbors) == 1
    assert neighbors[0].vertex.value == "apple"
    assert neighbors[0].weight == 10
Exemple #3
0
def test_add_edge():
    g = Graph()
    apple = g.add_node("apple")
    banana = g.add_node("banana")
    g.add_edge(apple, banana, 5)
    neighbors = g.get_neighbors(apple)
    assert len(neighbors) == 1
    assert neighbors[0].vertex.value == "banana"
    assert neighbors[0].weight == 5
Exemple #4
0
def test_add_edge_interloper_end():

    graph = Graph()

    end = Vertex("end")

    start = graph.add_node("start")

    with pytest.raises(KeyError):
        graph.add_edge(start, end)
Exemple #5
0
def knight_graph(board_size):
    kt_graph = Graph()
    for row in range(board_size):
        for col in range(board_size):
            node_id = pos_to_node_id(row, col, board_size)
            new_positions = gen_legal_moves(row, col, board_size)
            for e in new_positions:
                n_id = pos_to_node_id(e[0], e[1], board_size)
                kt_graph.add_edge(node_id, n_id)
    return kt_graph
Exemple #6
0
def generate_sample_friend_network():
    graph = Graph()

    graph.add_edge('Alex', 'Bob')
    graph.add_edge('Bob', 'Dan')
    graph.add_edge('Bob', 'Charlie')
    graph.add_edge('Charlie', 'Elsa')
    graph.add_edge('Elsa', 'Genna')

    return graph
Exemple #7
0
def shortest_reach(n, edges, s):
    graph = Graph(False)
    for vertex in range(1, n + 1):
        graph.add_vertex(vertex)
    for begin, end, weight in edges:
        graph.add_edge(begin, end, weight)
    shortest_paths = graph.dijkstra_shortest_path(s)
    return [
        value.distance if value.distance != inf else -1
        for key, value in sorted(shortest_paths.items()) if key != s
    ]
Exemple #8
0
def create_graph3():
    graph = Graph()
    nodes = [1, 2, 3, 4, 5]
    edges = [
        (1, 3, 1), (1, 2, 2), (3, 6, 3),
        (2, 4, 2), (4, 5, 1)
    ]
    for n in nodes:
        graph.add_node(n)
    for e in edges:
        graph.add_edge(e[0], e[1], e[2])
    return graph
Exemple #9
0
def create_graph():
    graph = Graph()
    nodes = [1, 2, 3, 4, 5]
    edges = [
        (1, 2, 1), (2, 3, 2),
        (3, 4, 3), (4, 5, 6)
    ]
    for n in nodes:
        graph.add_node(n)
    for e in edges:
        # node1, node2, weight
        graph.add_edge(e[0], e[1], e[2])
    return graph
Exemple #10
0
def cyclical_graph():
    graph = Graph()
    nodes = [1, 2, 3, 4, 5, 6, 7]
    edges = [
        (1, 2, 3), (2, 3, 3), (3, 5, 2),
        (5, 4, 2), (5, 6, 1), (4, 2, 1),
        (4, 7, 1)
    ]
    for n in nodes:
        graph.add_node(n)
    for e in edges:
        graph.add_edge(e[0], e[1], e[2])
    return graph
Exemple #11
0
def create_spaghetti():
    graph = Graph()
    nodes = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    edges = [
        (1, 2, 3), (1, 3, 2), (1, 4, 5),
        (2, 9, 5), (2, 5, 3), (2, 6, 6),
        (3, 5, 5), (3, 7, 2), (4, 6, 6),
        (4, 8, 2), (9, 5, 4), (6, 9, 4),
        (7, 8, 5)
    ]
    for n in nodes:
        graph.add_node(n)
    for e in edges:
        graph.add_edge(e[0], e[1], e[2])
    return graph
Exemple #12
0
    def test_add_edge(self):
        print('Test: test_add_edge')
        g = Graph()

        print('Test: Invalid input')
        self.assertRaises(ValueError, g.add_edge, None, None)

        print('Test: general case')
        n, n1 = g.add_node(), g.add_node()
        g.add_edge(n, n1)
        self.assertIn([n1, 0], n.neighbors)

        n2 = g.add_node()
        g.add_edge(n1, n2, 5)
        self.assertIn([n2, 5], n1.neighbors)
        print('Success: test_add_edge')
Exemple #13
0
def build_graph(w_list):
    d = {}
    g = Graph()
    for word in w_list:
        for i in range(len(word)):
            bucket = word[:i] + '_' + word[i + 1:]
            if bucket in d:
                d[bucket].append(word)
            else:
                d[bucket] = [word]

    for bucket in d.keys():
        for word1 in d[bucket]:
            for word2 in d[bucket]:
                if word1 != word2:
                    g.add_edge(word1, word2)
    return g
Exemple #14
0
def test_get_neighbors():

    graph = Graph()

    banana = graph.add_node("banana")

    apple = graph.add_node("apple")

    graph.add_edge(apple, banana, 44)

    neighbors = graph.get_neighbors(apple)

    assert len(neighbors) == 1

    neighbor_edge = neighbors[0]

    assert neighbor_edge.vertex.value == "banana"

    assert neighbor_edge.weight == 44
Exemple #15
0
def generate_sample_graph(is_directed=False):
    '''
    Will return a graph obj as such, either undirected or directed based on the optional arg:

    undirected

    [A] -> {'B', 'C'}
    [B] -> {'A', 'D', 'E'}
    [C] -> {'A', 'F'}
    [D] -> {'B'}
    [E] -> {'B', 'F'}
    [F] -> {'E', 'C'}

    directed

    [A] -> {'C', 'B'}
    [B] -> {'E', 'D'}
    [C] -> {'F'}
    [E] -> {'F'}
    '''

    graph = Graph(is_directed)

    graph.add_edge('A', 'B')
    graph.add_edge('A', 'C')
    graph.add_edge('B', 'D')
    graph.add_edge('B', 'E')
    graph.add_edge('C', 'F')
    graph.add_edge('E', 'F')

    return graph
def graph():

    realms = Graph()

    pandora = realms.add_node("Pandora")
    arendelle = realms.add_node("Arendelle")
    metroville = realms.add_node("Metroville")
    monstropolis = realms.add_node("Monstropolis")
    narnia = realms.add_node("Narnia")
    naboo = realms.add_node("Naboo")

    realms.add_edge(pandora, arendelle)

    realms.add_edge(arendelle, pandora)
    realms.add_edge(arendelle, metroville)
    realms.add_edge(arendelle, monstropolis)

    realms.add_edge(metroville, arendelle)
    realms.add_edge(metroville, monstropolis)
    realms.add_edge(metroville, narnia)

    realms.add_edge(monstropolis, arendelle)
    realms.add_edge(monstropolis, metroville)
    realms.add_edge(monstropolis, naboo)

    realms.add_edge(narnia, metroville)
    realms.add_edge(narnia, naboo)

    realms.add_edge(naboo, metroville)
    realms.add_edge(naboo, monstropolis)
    realms.add_edge(naboo, narnia)

    return realms
Exemple #17
0
def dijkstra(aGraph, start):
    pq = PriorityQueue()
    start.set_distance(0)
    pq.build_heap([(v, v.get_distance()) for v in aGraph])
    while not pq.is_empty():
        current_vert = pq.dequeue()[0]
        for next_vert in current_vert.get_connections():
            new_dist = current_vert.get_distance() + current_vert.get_weight(
                next_vert)
            if new_dist < next_vert.get_distance():
                next_vert.set_distance(new_dist)
                next_vert.set_pred(current_vert)
                pq.decrease_priority(next_vert, new_dist)


if __name__ == '__main__':

    g = Graph()
    g.add_edge('u', 'v', 2)
    g.add_edge('u', 'x', 1)
    g.add_edge('u', 'w', 5)
    g.add_edge('v', 'w', 3)
    g.add_edge('v', 'x', 2)
    g.add_edge('x', 'w', 3)
    g.add_edge('x', 'y', 1)
    g.add_edge('y', 'w', 1)
    g.add_edge('w', 'z', 5)
    g.add_edge('y', 'z', 1)

    dijkstra(g, g.get_vertex('u'))
    print(g.get_path('w'))
def planets():
    graph = Graph()

    metroville = graph.add_node("Metroville")
    pandora = graph.add_node("Pandora")
    arendelle = graph.add_node("Arendelle")
    new_monstropolis = graph.add_node("New Monstropolis")
    naboo = graph.add_node("Naboo")
    narnia = graph.add_node("Narnia")

    graph.add_edge(pandora, arendelle, 150)
    graph.add_edge(arendelle, pandora, 150)

    graph.add_edge(pandora, metroville, 82)
    graph.add_edge(metroville, pandora, 82)

    graph.add_edge(metroville, arendelle, 99)
    graph.add_edge(arendelle, metroville, 99)

    graph.add_edge(new_monstropolis, arendelle, 42)
    graph.add_edge(arendelle, new_monstropolis, 42)

    graph.add_edge(new_monstropolis, metroville, 105)
    graph.add_edge(metroville, new_monstropolis, 105)

    graph.add_edge(new_monstropolis, naboo, 73)
    graph.add_edge(naboo, new_monstropolis, 73)

    graph.add_edge(metroville, naboo, 26)
    graph.add_edge(naboo, metroville, 26)

    graph.add_edge(metroville, narnia, 37)
    graph.add_edge(narnia, metroville, 37)

    graph.add_edge(narnia, naboo, 250)
    graph.add_edge(naboo, narnia, 250)

    return graph
Exemple #19
0
def topological_sort(graph: Graph) -> None:
    visited = set()
    stack = Stack()
    for vertex in graph.adjacency_list:
        if vertex not in visited:
            _topological_sort(graph, vertex, visited, stack)
    print(stack)


def _topological_sort(graph: Graph, vertex: Any, visited: Set, stack: Stack) -> None:
    visited.add(vertex)

    for neighbor in graph.adjacency_list[vertex]:
        if neighbor[0] not in visited:
            _topological_sort(graph, neighbor[0], visited, stack)

    stack.push(vertex)


if __name__ == '__main__':
    graph = Graph()
    graph.add_edge(5, 2)
    graph.add_edge(5, 0)
    graph.add_edge(2, 3)
    graph.add_edge(3, 1)
    graph.add_edge(4, 1)
    graph.add_edge(4, 0)

    topological_sort(graph)