distance = [inf] * len(graph)
    visited = [False] * len(graph)
    distance[source] = 0
    while not queue.empty():
        dist, u = queue.get()
        for v in graph[u]:
            if not visited[v[0]] and relax(u, v, distance):
                queue.put((dist + v[1], v[0]))
        visited[u] = True
    return distance


def paths(G, s, t):
    edges = []
    for i in range(len(G)):
        for j in range(len(G[i])):
            edges.append((i, G[i][j][0], G[i][j][1]))
    distance_from_s = dijkstra_algorithm(G, s)
    distance_from_t = dijkstra_algorithm(G, t)
    count = 0
    if distance_from_s[t] == inf or distance_from_t[s] == inf:
        return 0
    for i in range(len(edges)):
        if (distance_from_s[edges[i][0]] + distance_from_t[edges[i][1]] + edges[i][2] == distance_from_s[t] or
                distance_from_s[edges[i][0]] + distance_from_t[edges[i][1]] + edges[i][2] == distance_from_t[s]):
            count += 1
    return count


runtests(paths)
예제 #2
0
            if T[new_row[i]][new_col[i]] != 0:
                take_fuel(T, new_row[i], new_col[i], actual_fuel)


def plan(T):
    stops = []
    limit = len(T[0])
    actual_fuel = [0]
    i = 0
    while i < limit:
        if T[0][i] != 0:
            actual_fuel[0] = 0
            take_fuel(T, 0, i, actual_fuel)
            T[0][i] = actual_fuel[0]
        i += 1
    queue = PriorityQueue()
    total_fuel = 0
    for i in range(limit - 1):
        if T[0][i] != 0:
            queue.put((-T[0][i], i))
        if total_fuel == 0:
            actual_value = queue.get()
            total_fuel -= actual_value[0]
            stops.append(actual_value[1])
        total_fuel -= 1
    stops.sort()
    return stops


runtests(plan)
예제 #3
0

def Floyd_Warshall_algorithm(graph):
    distance = [[inf] * len(graph) for _ in range(len(graph))]
    for i in range(len(distance)):
        for j in range(len(distance)):
            if i == j:
                distance[i][j] = 0
            elif graph[i][j] != 0:
                distance[i][j] = graph[i][j]
    for k in range(len(graph)):
        for u in range(len(graph)):
            for v in range(len(graph)):
                distance[u][v] = min(distance[u][v],
                                     distance[u][k] + distance[k][v])
    return distance


def BlueAndGreen(T, K, D):
    graph = [[0] * (len(T) + 2) for _ in range(len(T) + 2)]
    distance = Floyd_Warshall_algorithm(T)
    for i in range(len(T)):
        for j in range(len(T)):
            if distance[i][j] >= D and distance[i][j] != inf:
                if K[i] == 'B' and K[j] == 'G':
                    graph[i][j] = graph[j][len(T) + 1] = graph[len(T)][i] = 1
    return edmonds_karp(graph, len(T), len(T) + 1)


runtests(BlueAndGreen)
        for j in range(len(buckets[i])):
            buckets[i][j] = insertion_sort(buckets[i][j])
    idx = 0
    for i in range(len(buckets)):
        for j in range(len(buckets[i])):
            for k in range(len(buckets[i][j])):
                T[idx] = buckets[i][j][k]
                idx += 1
    return T


def SortTab(T, P):
    buckets = [[] for _ in range(len(P))]
    for i in range(len(T)):
        for j in range(len(P)):
            if T[i] > P[j][0] and T[i] < P[j][1]:
                buckets[j].append(T[i])
    max_min = []
    for i in range(len(buckets)):
        minimum = min(buckets[i])
        maximum = max(buckets[i])
        max_min.append((minimum, maximum))
    new_buckets = []
    for i in range(len(P)):
        array = [[] for _ in range(len(buckets[i]))]
        new_buckets.append(array)
    bucket_sort(T, new_buckets, max_min)


runtests(SortTab)
예제 #5
0
def kintersect(A, k):
    interval = [(i, A[i][0], A[i][1]) for i in range(len(A))]
    interval.sort(key=lambda x: x[2], reverse=True)
    max_length = 0
    if k == 1:
        result = [0]
        for i in range(len(A)):
            if interval[i][2] - interval[i][1] > max_length:
                max_length = interval[i][2] - interval[i][1]
                result[0] = interval[i][0]
        return result
    result = []
    for i in range(len(A)):
        current = [interval[i][0]]
        for j in range(len(A)):
            if i != j and interval[j][1] <= interval[i][1] < interval[j][2]:
                current.append(interval[j][0])
                if len(current) == k:
                    actual_length = min(interval[j][2] - interval[i][1],
                                        interval[i][2] - interval[i][1])
                    if actual_length > max_length:
                        max_length = actual_length
                        result.clear()
                        result = [current[i] for i in range(k)]
                    break
    return result


runtests(kintersect)
# i ma jeden przełącznik, który zmienia jej kolor (z zielonego na czerwony, z czerwonego na niebieski
# i z niebieskiego na zielony). Początkowo wszystkie lampki świecą na zielono. Operacja (a, b) oznacza
# "wciśnięcie przełącznika na każdej z lampek o numerach od a do b". Wykonanych będzie m operacji.
# Proszę napisać funkcję:
# def lamps(n, L):
#     ...
# która mając daną liczbę n lampek oraz listę L operacji (wykonywanych w podanej kolejności) zwraca
# ile maksymalnie lampek świeciło się na niebiesko (lampki są liczone na początku i po wykonaniu
# każdej operacji).
from Exercise_3_tests import runtests


def lamps(n, T):
    all_lamps = [0] * n
    max_blue = actual_blue = 0
    for i in range(len(T)):
        for j in range(T[i][0], T[i][1] + 1):
            if all_lamps[j] == 0:
                all_lamps[j] = 1
            elif all_lamps[j] == 1:
                all_lamps[j] = 2
                actual_blue += 1
            elif all_lamps[j] == 2:
                all_lamps[j] = 0
                actual_blue -= 1
        max_blue = max(max_blue, actual_blue)
    return max_blue


runtests(lamps)
            if DP[i][j] != inf:
                actual = V[i] + j
                if actual > q:
                    actual = q
                for k in range(i + 1, len(T)):
                    if relax(DP, T, parent, actual, i, j, k):
                        continue
                    else:
                        break
    best = inf
    index = None
    for i in range(q + 1):
        if DP[len(T) - 1][i] < best:
            best = DP[len(T) - 1][i]
            index = i
    result = []
    if best == inf:
        return result
    i = len(T) - 1
    p = inf
    while p != 0:
        p = parent[i][index][0]
        result.append(p)
        index = parent[i][index][1]
        i = p
    result.reverse()
    return result


runtests(iamlate)