예제 #1
0
def topo_sort_bfs(g:Graph):
    #建立入度表
    in_degrees = {}
    for v in g:
        if v.id not in in_degrees:
            in_degrees[v.id] = 0
        for nbr in v.getConnections():
            in_degrees[nbr.id] = in_degrees.get(nbr.id,0) + 1
    # print(in_degrees)

    #找起始节点
    queue = []
    for key,value in in_degrees.items():
        if value == 0:
            queue.append(key)
    #拓扑排序
    tuopu = []
    while queue:
        cur_id = queue.pop(0)
        tuopu.append(cur_id)
        for nbr in g.getVertex(cur_id).getConnections():
            in_degrees[nbr.id] = in_degrees.get(nbr.id) - 1
            if in_degrees[nbr.id] == 0:
                queue.append(nbr.id)
    #返回结果
    return tuopu if len(tuopu) == len(g.getVertices()) else []
예제 #2
0
def topo_sort_dfs(g:Graph):
    #找出有入度的节点
    in_nodes = set()
    for v in g:
        for nbr in v.getConnections():
           in_nodes.add(nbr.id)
    #找出起始节点
    start_nodes = []
    for node in g.getVertices():
        if node not in list(in_nodes):
            start_nodes.append(node)
    '''
    对递归版dfs做点改变
    '''
    def dfs(node:Vertex,path=''):
        if not node.getConnections():
            paths.append(path + node.id)
            return
        for nbr in node.getConnections():
            dfs(nbr,path + node.id)
        return

    paths = []
    for node in start_nodes:
        dfs(g.getVertex(node))

    #打印结果
    for str in paths:
        for char in str:
            print(char,end=' ')
        print()
예제 #3
0
                n.setPred(closest)
                n.setDistance(newCost)
                pq.decreaseKey(n, newCost)

    return G


g = Graph()
g.addVertex(0)
g.addVertex(1)
g.addVertex(2)
g.addVertex(3)

g.addEdge(0, 1, 10)
g.addEdge(1, 0, 10)
g.addEdge(0, 2, 6)
g.addEdge(2, 0, 6)
g.addEdge(0, 3, 5)
g.addEdge(3, 0, 5)
g.addEdge(1, 3, 15)
g.addEdge(3, 1, 15)
g.addEdge(2, 3, 4)
g.addEdge(3, 2, 4)

p = prim(g, g.getVertex(0))

for v in p:
    if v.getDistance() != sys.maxsize and v.getPred() is not None:
        print(
            f'src={v.getPred().getId()}, dest={v.getId()}, weight={v.getDistance()}'
        )
예제 #4
0
            if new_distance < n.getDistance():
                n.setDistance(new_distance)
                n.setPred(closest)
                # O(E*logV)
                pq.decreaseKey(n, new_distance)


g = Graph()
g.addVertex(0)
g.addVertex(1)
g.addVertex(2)
g.addVertex(3)

g.addEdge(0, 1, 10)
g.addEdge(0, 2, 6)
g.addEdge(0, 3, 5)
g.addEdge(1, 3, 15)
g.addEdge(2, 3, 4)
d = dijsktras(g, g.getVertex(0))
print('Distances from {}: '.format(0), end="\n")
print("********************")
for v in d:
    print('Distance to {}: {}'.format(v.getId(), d[v]))
print()

d_p = dijkstras_pq(g, g.getVertex(0))
print('Distances from {}: '.format(0), end="\n")
print("********************")
for v in g:
    print('Distance to {}: {}'.format(v.getId(), v.getDistance()))
print()
예제 #5
0
from pythonds import Graph
import timeit
from algorithms import Prims
from Stats import Display

graph = Graph()
Display.creategraph(Display, graph)
v = graph.getVertex(1)
testing = 10
exe = 0
exe2 = 0

# Prim 1
for i in range(testing):
    start_time = timeit.default_timer()
    Prims.prim1(Prims, graph, v)
    time = timeit.default_timer() - start_time
    exe += time
average = exe / testing
print("Prim 1 took:", average, 'on average')
'''

# Prim 2
for x in range(testing):
    start_time = timeit.default_timer()
    Prims.prim2(Prims, graph, v)
    time = timeit.default_timer() - start_time
    exe2 += time
average = exe2 / testing
print("Prim 2 took:", average, 'on average')