Lekcja – Czy istnieje ścieżka (BFS)

V = {
    'P' : ['K', 'Q', 'H'],
    'D1': ['D2','E'],
    'D2': ['D1',],
    'K' : ['P', 'Q'],
    'Q' : ['P', 'K', 'H'],
    'H' : ['P', 'Q'],
    'E' : ['D1']
}

def is_path_between(V, source, dest):

    list_to_check = [source]
    list_visited = []

    while list_to_check:

        current_node = list_to_check.pop(0)
        if current_node == dest:
            return True
        else:
            if current_node not in list_visited:
                list_visited.append(current_node)
                list_to_check.extend(V[current_node])

    return False

for s in V.keys():
    for d in V.keys():
        if s != d:
            print(f'Path {s} - {d} - {is_path_between(V, s, d)}')    

#%%
V = {
    'P' : ['K', 'Q', 'H'],
    'D1': ['D2','E'],
    'D2': ['D1',],
    'K' : ['P', 'Q'],
    'Q' : ['P', 'K', 'H'],
    'H' : ['P', 'Q'],
    'E' : ['D1']
}

def is_path_between(V, source, dest):

    list_to_check = [source]
    list_visited = []

    while list_to_check:

        current_node = list_to_check.pop(0)
        # optimization 1 - if the destination is in the current node's neighbours
        if current_node == dest or dest in V[current_node]:
            return True
        else:
            if current_node not in list_visited:
                list_visited.append(current_node)
                list_to_check.extend(V[current_node])
                # optimization 2 - add to "list_to_check" only nodes 
                list_to_check.extend( [x for x in V[current_node] if x not in list_visited] )

    return False

for s in V.keys():
    for d in V.keys():
        if s != d:
            print(f'Path {s} - {d} - {is_path_between(V, s, d)}')

Lab

import csv

network = {}
select_month = 1

with open('data/usa-domestic-flight-2019.csv') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {", ".join(row)}')
            line_count += 1
        else:
            line_count += 1
            origin = row[8]
            destination = row[11]
            month = int(row[12])

            if month != select_month:# or passengers == 0:
                continue

            if origin not in network.keys():
                network[origin] = [destination]
            else:
                if destination not in network[origin]:
                    network[origin].append(destination)

               
current_keys = list(network.keys())
for origin in current_keys:
    for destination in network[origin]:
        if destination not in network.keys():
            network[destination] = []

print(f'Processed {line_count} lines.')
#print(network.keys())

def is_path_between(V, source, dest):

    list_to_check = [source]
    list_visited = []

    while list_to_check:

        current_node = list_to_check.pop(0)
        if current_node == dest:
            return True
        else:
            if current_node not in list_visited:
                list_visited.append(current_node)
                list_to_check.extend(V[current_node])

    return False


start = 'San Francisco, CA'
stop = 'Vernal, UT'
print(f"connection from {start} to {stop}: {is_path_between(network, start, stop)}")

start = 'Vernal, UT'
stop = 'San Francisco, CA'
print(f"connection from {start} to {stop}: {is_path_between(network, start, stop)}")

start = 'Kotzebue, AK'
stop = 'Danger Bay, AK'
print(f"connection from {start} to {stop}: {is_path_between(network, start, stop)}")