EXPERIMENT-01 BFS graph '5' '3' '7' '2' '4' '8' } = : : : : : : { ['3','7'], ['2', '4'], ['8'], [], ['8'], [] visited = [] queue = [] def bfs(visited, graph, node): visited.append(node) queue.append(node) while queue: m = queue.pop(0) print (m, end = " ") for neighbour in graph[m]: if neighbour not in visited: visited.append(neighbour) queue.append(neighbour) print("Following is the Breadth-First Search") bfs(visited, graph, '5') OUTPUT: Following is the Breadth-First Search 5 3 7 2 4 8 DFS graph '5' '3' '7' '2' '4' '8' } = : : : : : : { ['3','7'], ['2', '4'], ['8'], [], ['8'], [] visited = set() def dfs(visited, graph, node): if node not in visited: print (node) visited.add(node) for neighbour in graph[node]: dfs(visited, graph, neighbour) print("Following is the Depth-First Search") dfs(visited, graph, '5') OUTPUT: Following is the Depth-First Search 5 3 2 4 8 7 EXPERIMENT-02 A* Algorithm from collections import deque class Graph: def __init__(self, adjacency_list): self.adjacency_list = adjacency_list def get_neighbors(self, v): return self.adjacency_list[v] def h(self, n): H = { 'A': 1, 'B': 1, 'C': 1, 'D': 1 } return H[n] def a_star_algorithm(self, start_node, stop_node): open_list = set([start_node]) closed_list = set([]) g = {} g[start_node] = 0 parents = {} parents[start_node] = start_node while len(open_list) > 0: n = None for v in open_list: if n == None or g[v] + self.h(v) < g[n] + self.h(n): n = v if n == None: print('Path does not exist!') return None if n == stop_node: reconst_path = [] while parents[n] != n: reconst_path.append(n) n = parents[n] reconst_path.append(start_node) reconst_path.reverse() print('Path found: {}'.format(reconst_path)) return reconst_path for (m, weight) in self.get_neighbors(n): if m not in open_list and m not in closed_list: open_list.add(m) parents[m] = n g[m] = g[n] + weight else: if g[m] > g[n] + weight: g[m] = g[n] + weight parents[m] = n if m in closed_list: closed_list.remove(m) open_list.add(m) open_list.remove(n) closed_list.add(n) print('Path does not exist!') return None adjacency_list = { 'A': [('B', 1), ('C', 3), ('D', 7)], 'B': [('D', 5)], 'C': [('D', 12)] } graph1 = Graph(adjacency_list) graph1.a_star_algorithm('A', 'D') OUTPUT: Path found: ['A', 'B', 'D'] EXPERIMENT-03 Prims algorithm import sys class Graph(): def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] def printMST(self, parent): print("Edge \tWeight") for i in range(1, self.V): print(parent[i], "-", i, "\t", self.graph[i][parent[i]]) def minKey(self, key, mstSet): # Initialize min value min = sys.maxsize for v in range(self.V): if key[v] < min and mstSet[v] == False: min = key[v] min_index = v return min_index def primMST(self): key = [sys.maxsize] * self.V parent = [None] * self.V # Array to store constructed MST key[0] = 0 mstSet = [False] * self.V parent[0] = -1 # First node is always the root of for cout in range(self.V): u = self.minKey(key, mstSet) mstSet[u] = True for v in range(self.V): if self.graph[u][v] > 0 and mstSet[v] == False and key[v] > self.graph[u][v]: key[v] = self.graph[u][v] parent[v] = u self.printMST(parent) if __name__ == '__main__': g = Graph(5) g.graph = [[0, 2, 0, 6, 0], [2, 0, 3, 8, 5], [0, 3, 0, 0, 7], [6, 8, 0, 0, 9], [0, 5, 7, 9, 0]] g.primMST() OUTPUT: Edge Weight 0-1 2 1-2 3 0-3 6 1-4 5 Experiment-04 NQUEEN PROBLEMS print ("Enter the number of queens") N = int(input()) board = [[0]*N for _ in range(N)] def is_attack(i, j): for k in range(0,N): if board[i][k]==1 or board[k][j]==1: return True for k in range(0,N): for l in range(0,N): if (k+l==i+j) or (k-l==i-j): if board[k][l]==1: return True return False def N_queen(n): if n==0: return True for i in range(0,N): for j in range(0,N): '''checking if we can place a queen here or not queen will not be placed if the place is being attacked or already occupied''' if (not(is_attack(i,j))) and (board[i][j]!=1): board[i][j] = 1 if N_queen(n-1)==True: return True board[i][j] = 0 return False N_queen(N) for i in board: print (i) Output: Enter the number of queens 8 [1, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 1, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 1] [0, 0, 0, 0, 0, 1, 0, 0] [0, 0, 1, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 1, 0] [0, 1, 0, 0, 0, 0, 0, 0] [0, 0, 0, 1, 0, 0, 0, 0]