Legrovidebb ut feladatok
Dijkstra
futasido: naivan, binaris kupaccal.
def dijkstra(G, s):
# Initialize distances and visited set
dist = {v: float('inf') for v in G.vertices()}
dist[s] = 0
visited = set()
parent = {s: s}
# Priority queue of unvisited vertices
unvisited = set(G.vertices())
while len(unvisited) > 0:
# Find vertex with minimum distance
u = min(unvisited, key=lambda v: dist[v]) # use heap instead
unvisited.remove(u)
visited.add(u)
# Update distances to neighbors
for v in G.neighbors(u):
if v in unvisited:
new_dist = dist[u] + G.edge_weight(u, v)
if new_dist < dist[v]:
dist[v] = new_dist
parent[v] = u
return dist, parent
Bellman-Ford
def BF(G, c):
p = [0 for _ in range(n)]
dist = [float('inf') for _ in range(n)]
p[s], dist[s] = s, 0
for i in range(n - 1):
for u in range(n):
for v in u.neighbors():
if dist[u] + c(u, v) < dist[v]:
dist[v] = dist[u] + c(u, v)
p[v] = u
# test if change happens after n-1 iterations, if so, non conservative weights
for u in range(n):
for v in u.neighbors():
if dist[u] + c(u, v) < dist[v]:
p[v] = u
return "non conservative", K, p, v
return "conservative", K, p, s
Kereses
Binaris kereses rendezett tombben
def binary_search(arr, val):
left, right = 0, len(arr) - 1
while left <= right:
middle = (left + right) // 2
if arr[middle] == val:
return middle
elif arr[middle] < val:
left = middle + 1
else:
right = middle - 1
return -1 # not found
BFS
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
node = queue.popleft()
print(node, end=" ")
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
DFS
def dfs(graph, node, visited=None):
if visited is None:
visited = set()
if node not in visited:
visited.add(node)
print(node, end=" ")
for neighbor in graph[node]:
dfs(graph, neighbor, visited)