Design And Analysis Of Algorithms Lab 1. Use divide and conquer method to recursively find the maximum and minimum elements in a given list of n elements. #include < stdio.h > #include < stdlib.h > struct MinMax { int min ; int max ; }; struct MinMax findMinMax ( int arr[] , int low , int high ) { struct MinMax mm , mml , mmr ; if ( low == high ) { mm min = arr [ low ]; mm max = arr [ low ]; return mm ; } if ( high - low == 1 ) { mm min = ( arr [ low ] < arr [ high ]) ? arr [ low ] : arr [ high ]; mm max = ( arr [ low ] > arr [ high ]) ? arr [ low ] : arr [ high ]; return mm ; } int mid = ( low + high ) / 2 ; mml = findMinMax ( arr , low , mid ); mmr = findMinMax ( arr , mid + 1 , high ); mm min = ( mml min < mmr min ) ? mml min : mmr min ; mm max = ( mml max > mmr max ) ? mml max : mmr max ; return mm ; } int main () { int n ; printf (" Enter the number of elements: "); scanf (" %d ", & n ); int arr [ n ]; printf (" Enter the elements: "); for ( int i = 0 ; i < n ; i ++) { scanf (" %d ", & arr [ i ]); } struct MinMax mm = findMinMax ( arr , 0 , n - 1 ); printf (" Minimum element: %d\n ", mm min ); printf (" Maximum element: %d\n ", mm max ); return 0 ; } 2. Sort a given set of elements using Merge Sort method and determine the Ɵ me required to sort the elements. Repeat the experiment for different values of n, the number of elements in the list to be sorted and plot a graph of Ɵ me taken versus n. The elements can be read from a file or can be generated using the random number generator. #include < stdio.h > #include < stdlib.h > #include < time.h > void merge ( int arr[] , int l , int m , int r ) { int n1 = m - l + 1 ; int n2 = r - m ; int L [ n1 ], R [ n2 ]; for ( int i = 0 ; i < n1 ; i ++) { L [ i ] = arr [ l + i ]; } for ( int j = 0 ; j < n2 ; j ++) { R [ j ] = arr [ m + 1 + j ]; } int i = 0 , j = 0 , k = l ; while ( i < n1 && j < n2 ) { if ( L [ i ] <= R [ j ]) { arr [ k ++] = L [ i ++]; } else { arr [ k ++] = R [ j ++]; } } while ( i < n1 ) { arr [ k ++] = L [ i ++]; } while ( j < n2 ) { arr [ k ++] = R [ j ++]; } } void mergesort ( int arr[] , int l , int r ) { if ( l < r ) { int m = ( l + r ) / 2 ; mergesort ( arr , l , m ); mergesort ( arr , m + 1 , r ); merge ( arr , l , m , r ); } } void genRandomArray ( int arr[] , int n ) { for ( int i = 0 ; i < n ; i ++) { arr [ i ] = rand () % 100 ; } } void printArray ( int arr[] , int n ) { for ( int i = 0 ; i < n ; i ++) { printf (" %d ", arr [ i ]); } printf (" \n "); } double getTime ( clock_t start , clock_t end ) { return ( double )( end - start ) / CLOCKS_PER_SEC ; } int main () { int n , arr [ 100000 ], choice ; FILE * fp ; while ( 1 ) { printf (" \n\n1. Merge Sort\n2. Graph Data\n3. Exit\nEnter your choice: "); scanf (" %d ", & choice ); switch ( choice ) { case 1 : printf (" Enter the number of elements: "); scanf (" %d ", & n ); genRandomArray ( arr , n ); printf (" Array before sorting: "); printArray ( arr , n ); clock_t start = clock (); mergesort ( arr , 0 , n - 1 ); clock_t end = clock (); printf (" Array after sorting: "); printArray ( arr , n ); printf (" Time taken: %lf\n ", getTime ( start , end )); break ; case 2 : fp = fopen (" mergesort.txt ", " w "); for ( int i = 10000 ; i <= 100000 ; i += 10000 ) { genRandomArray ( arr , i ); clock_t start = clock (); mergesort ( arr , 0 , i - 1 ); clock_t end = clock (); fprintf ( fp , " %d\t%lf\n ", i , getTime ( start , end )); } fclose ( fp ); printf (" Graph data written to file mergesort.txt "); break ; case 3 : exit ( 0 ); default : printf (" Invalid choice "); break ; } } } 3. Sort a given set of elements using Quick Sort method and determine the Ɵ me required to sort the elements. Repeat the experiment for different values of n, the number of elements in the list to be sorted and plot a graph of Ɵ me taken versus n. The elements can be read from a file or can be generated using the random number generator. #include < stdio.h > #include < stdlib.h > #include < time.h > void swap ( int * a , int * b ) { int temp = * a ; * a = * b ; * b = temp ; } int partition ( int arr[] , int low , int high ) { int pivot = arr [ low ]; int i = low , j = high ; while ( i < j ) { while ( arr [ i ] <= pivot && i < high ) { i ++; } while ( arr [ j ] >= pivot && j > low ) { j --; } if ( i < j ) { swap (& arr [ i ], & arr [ j ]); } } swap (& arr [ low ], & arr [ j ]); return j ; } void quicksort ( int arr[] , int low , int high ) { if ( low < high ) { int s = partition ( arr , low , high ); quicksort ( arr , low , s - 1 ); quicksort ( arr , s + 1 , high ); } } void genRandomArray ( int arr[] , int n ) { for ( int i = 0 ; i < n ; i ++) { arr [ i ] = rand () % 100 ; } } void printArray ( int arr[] , int n ) { for ( int i = 0 ; i < n ; i ++) { printf (" %d ", arr [ i ]); } printf (" \n "); } double getTime ( clock_t start , clock_t end ) { return ( double )( end - start ) / CLOCKS_PER_SEC ; } int main () { int n , arr [ 100000 ], choice ; FILE * fp ; while ( 1 ) { printf (" \n\n1. Quick Sort\n2. Graph Data\n3. Exit\nEnter your choice: "); scanf (" %d ", & choice ); switch ( choice ) { case 1 : printf (" Enter the number of elements: "); scanf (" %d ", & n ); genRandomArray ( arr , n ); printf (" Array before sorting: "); printArray ( arr , n ); clock_t start = clock (); quicksort ( arr , 0 , n - 1 ); clock_t end = clock (); printf (" Array after sorting: "); printArray ( arr , n ); printf (" Time taken: %f\n ", getTime ( start , end )); break ; case 2 : fp = fopen (" quicksort.txt ", " w "); for ( int i = 10000 ; i <= 100000 ; i += 10000 ) { genRandomArray ( arr , i ); clock_t start = clock (); quicksort ( arr , 0 , i - 1 ); clock_t end = clock (); fprintf ( fp , " %d\t%lf\n ", i , getTime ( start , end )); } fclose ( fp ); printf (" Graph data written to quicksort.txt "); break ; case 3 : exit ( 0 ); default : printf (" Invalid choice "); break ; } } } 4. Obtain the Topological Ordering of ver Ɵ ces in a given digraph DFS Method #include < stdio.h > #include < stdlib.h > #define MAX 100 int count = 0 , visited [ MAX ]; char stack [ MAX ]; int top = - 1 ; void dfs ( int v , int a[] [ MAX ], int num_ver , char vertices[] ) { visited [ v ] = ++ count ; printf (" Vertex %c is marked with %d\n ", vertices [ v ], count ); for ( int w = 0 ; w < num_ver ; w ++) { if ( a [ v ][ w ] == 1 && visited [ w ] == 0 ) { dfs ( w , a , num_ver , vertices ); } } stack [++ top ] = vertices [ v ]; } void DFS ( int a[] [ MAX ], int num_ver , char vertices[] ) { for ( int i = 0 ; i < num_ver ; i ++) { visited [ i ] = 0 ; } for ( int v = 0 ; v < num_ver ; v ++) { if ( visited [ v ] == 0 ) { dfs ( v , a , num_ver , vertices ); } } } int main () { int a [ MAX ][ MAX ], num_ver ; char vertices [ MAX ]; printf (" Enter the number of vertices: "); scanf (" %d ", & num_ver ); printf (" Enter the vertices: "); for ( int i = 0 ; i < num_ver ; i ++) { scanf (" %c ", & vertices [ i ]); } printf (" Enter the adjacency matrix: \n "); for ( int i = 0 ; i < num_ver ; i ++) { for ( int j = 0 ; j < num_ver ; j ++) { scanf (" %d ", & a [ i ][ j ]); } } printf (" \nDFS Traversal: \n "); DFS ( a , num_ver , vertices ); printf (" \nTopological order: "); for ( int i = top ; i >= 0 ; i --) { printf (" %c ", stack [ i ]); } printf (" \n "); return 0 ; } Source Removal Method #include < stdio.h > #include < stdlib.h > #define MAX 100 int indegree [ MAX ]; int findSource ( int num_ver ) { for ( int i = 0 ; i < num_ver ; i ++) { if ( indegree [ i ] == 0 ) { return i ; } } } int main () { int a [ MAX ][ MAX ], num_ver ; char vertices [ MAX ]; printf (" Enter the number of vertices: "); scanf (" %d ", & num_ver ); printf (" Enter the vertices: "); for ( int i = 0 ; i < num_ver ; i ++) { getchar (); scanf (" %c ", & vertices [ i ]); } printf (" Enter the adjacency matrix: "); for ( int i = 0 ; i < num_ver ; i ++) { for ( int j = 0 ; j < num_ver ; j ++) { scanf (" %d ", & a [ i ][ j ]); } } for ( int i = 0 ; i < num_ver ; i ++) { int count = 0 ; for ( int j = 0 ; j < num_ver ; j ++) { if ( a [ j ][ i ] == 1 ) { count ++; } } indegree [ i ] = count ; } printf (" \nTopological order: "); for ( int i = 0 ; i < num_ver ; i ++) { int source = findSource ( num_ver ); for ( int j = 0 ; j < num_ver ; j ++) { if ( a [ source ][ j ] == 1 ) { indegree [ j ]--; } } indegree [ source ] = - 1 ; printf (" %c ", vertices [ source ]); } return 0 ; } 5. Print all the nodes reachable from a given star Ɵ ng node in a given digraph using Depth First Search method. #include < stdio.h > #include < stdlib.h > #define MAX 100 int count = 0 , visited [ MAX ]; void dfs ( int v , int a[] [ MAX ], int num_ver , char vertices[] ) { visited [ v ] = ++ count ; printf (" Vertex %c is marked with %d\n ", vertices [ v ], count ); for ( int w = 0 ; w < num_ver ; w ++) { if ( a [ v ][ w ] == 1 && visited [ w ] == 0 ) { dfs ( w , a , num_ver , vertices ); } } } void DFS ( int a[] [ MAX ], int num_ver , char vertices[] , int start ) { for ( int i = 0 ; i < num_ver ; i ++) { visited [ i ] = 0 ; } dfs ( start , a , num_ver , vertices ); } int main () { int a [ MAX ][ MAX ], num_ver , start ; char vertices [ MAX ]; printf (" Enter th number of vertices: "); scanf (" %d ", & num_ver ); printf (" Enter the vertices: "); for ( int i = 0 ; i < num_ver ; i ++) { getchar (); scanf (" %c ", & vertices [ i ]); } printf (" Enter the adjacency matrix: \n "); for ( int i = 0 ; i < num_ver ; i ++) { for ( int j = 0 ; j < num_ver ; j ++) { scanf (" %d ", & a [ i ][ j ]); } } printf (" Enter the starting vertex: "); scanf (" %d ", & start ); printf (" \nNodes reachable from starting node %c using DFS traversal are: \n ", vertices [ start ]); DFS ( a , num_ver , vertices , start ); return 0 ; } 6. Print all the nodes reachable from a given star Ɵ ng node in a given digraph using breadth First Search method. #include < stdio.h > #include < stdlib.h > #define MAX 100 int count = 0 , visited [ MAX ]; int queue [ MAX ], f = 0 , r = - 1 ; void bfs ( int v , int a[] [ MAX ], int num_ver , char vertices[] ) { visited [ v ] = ++ count ; printf (" Vertex %c is marked with %d\n ", vertices [ v ], count ); queue [++ r ] = v ; while ( f <= r ) { int cur_ver = queue [ f ++]; for ( int w = 0 ; w < num_ver ; w ++) { if ( a [ cur_ver ][ w ] == 1 && visited [ w ] == 0 ) { visited [ w ] = ++ count ; printf (" Vertex %c is marked with %d\n ", vertices [ w ], count ); queue [++ r ] = w ; } } } } void BFS ( int a[] [ MAX ], int num_ver , char vertices[] , int start ) { for ( int i = 0 ; i < num_ver ; i ++) { visited [ i ] = 0 ; } bfs ( start , a , num_ver , vertices ); } int main () { int a [ MAX ][ MAX ], num_ver , start ; char vertices [ MAX ]; printf (" Enter the number of vertices: "); scanf (" %d ", & num_ver ); printf (" Enter the vertices: "); for ( int i = 0 ; i < num_ver ; i ++) { getchar (); scanf (" %c ", & vertices [ i ]); } printf (" Enter the adjacency matrix: \n "); for ( int i = 0 ; i < num_ver ; i ++) { for ( int j = 0 ; j < num_ver ; j ++) { scanf (" %d ", & a [ i ][ j ]); } } printf (" Enter the starting vertex: "); scanf (" %d ", & start ); printf (" \nNodes reachable from starting node %c using BFS traversal are: \n ", vertices [ start ]); BFS ( a , num_ver , vertices , start ); return 0 ; } 7. Sort a given set of elements using Heap Sort method and determine the Ɵ me required to sort the elements. Repeat the experiment for different values of n, the number of elements in the list to be sorted and plot a graph of Ɵ me taken versus n. The elements can be read from a file or can be generated using the random number generator. #include < stdio.h > #include < stdlib.h > #include < time.h > void swap ( int * a , int * b ) { int temp = * a ; * a = * b ; * b = temp ; } void heapify ( int arr[] , int n , int i ) { int largest = i ; int left = 2 * i + 1 ; int right = 2 * i + 2 ; if ( left < n && arr [ left ] > arr [ largest ]) { largest = left ; } if ( right < n && arr [ right ] > arr [ largest ]) { largest = right ; } if ( largest != i ) { swap (& arr [ i ], & arr [ largest ]); heapify ( arr , n , largest ); } } void heapsort ( int arr[] , int n ) { for ( int i = n / 2 - 1 ; i >= 0 ; i --) { heapify ( arr , n , i ); } for ( int i = n - 1 ; i >= 0 ; i --) { swap (& arr [ 0 ], & arr [ i ]); heapify ( arr , i , 0 ); } } void genRandomArray ( int arr[] , int n ) { for ( int i = 0 ; i < n ; i ++) { arr [ i ] = rand () % 100 ; } } void printArray ( int arr[] , int n ) { for ( int i = 0 ; i < n ; i ++) { printf (" %d ", arr [ i ]); } printf (" \n "); } double getTime ( clock_t start , clock_t end ) { return ( double )( end - start ) / CLOCKS_PER_SEC ; } int main () { int n , arr [ 100000 ], choice ; FILE * fp ; while ( 1 ) { printf (" \n\n1. Heap Sort\n2. Graph Data\n3. Exit\nEnter your choice: "); scanf (" %d ", & choice ); switch ( choice ) { case 1 : printf (" Enter the number of elements: "); scanf (" %d ", & n ); genRandomArray ( arr , n ); printf (" Array before sorting: "); printArray ( arr , n ); clock_t start = clock (); heapsort ( arr , n ); clock_t end = clock (); printf (" Array after sorting: "); printArray ( arr , n ); printf (" Time taken: %f\n ", getTime ( start , end )); break ; case 2 : fp = fopen (" heapsort.txt ", " w "); for ( int i = 10000 ; i <= 100000 ; i += 10000 ) { genRandomArray ( arr , i ); clock_t start = clock (); heapsort ( arr , i ); clock_t end = clock (); fprintf ( fp , " %d\t%lf\n ", i , getTime ( start , end )); } fclose ( fp ); printf (" Graph data written to heapsort.txt "); break ; case 3 : exit ( 0 ); default : printf (" Invalid choice "); break ; } } } 8. Implement Horspool algorithm for string matching. #include < stdio.h > #include < string.h > #include < stdlib.h > #define MAX 256 void GenShiftTable ( char pattern[] , int table[] ) { int m , i , j ; m = strlen ( pattern ); for ( i = 0 ; i < MAX ; i ++) { table [ i ] = m ; } for ( j = 0 ; j < m - 1 ; j ++) { table [ pattern [ j ]] = m - 1 - j ; } } int Horspool ( char str[] , char pattern[] , int table[] ) { int i , n , m , k ; n = strlen ( str ); m = strlen ( pattern ); i = m - 1 ; while ( i < n ) { k = 0 ; while (( k < m ) && ( pattern [ m - 1 - k ] == str [ i - k ])) k ++; if ( k == m ) return i - m + 1 ; else i = i + table [ str [ i ]]; } return - 1 ; } int main ( void ) { char text [ MAX ], pattern [ MAX ]; int shiftTable [ MAX ], found ; printf (" Enter the source string: "); scanf (" %s ", text ); printf (" Enter the pattern string: "); scanf (" %s ", pattern ); GenShiftTable ( pattern , shiftTable ); found = Horspool ( text , pattern , shiftTable ); if ( found == - 1 ) printf (" Matching Substring not found.\n "); else printf (" Matching Substring found at position: %d\n ", found + 1 ); return 0 ; } 9. Implement 0/1 Knapsack problem using dynamic programing. #include < stdio.h > #define MAX_ITEMS 100 int max ( int a , int b ) { return ( a > b ) ? a : b ; } void knapsack ( int values[] , int weights[] , int n , int capacity ) { int dp [ MAX_ITEMS + 1 ][ capacity + 1 ], w1 , res , i , w ; for ( i = 0 ; i <= n ; i ++) { for ( w = 0 ; w <= capacity ; w ++) { if ( i == 0 || w == 0 ) { dp [ i ][ w ] = 0 ; } else if ( weights [ i - 1 ] <= w ) { dp [ i ][ w ] = max ( values [ i - 1 ] + dp [ i - 1 ][ w - weights [ i - 1 ]], dp [ i - 1 ][ w ]); } else { dp [ i ][ w ] = dp [ i - 1 ][ w ]; } } } printf (" \nKnapsack table:\n "); for ( i = 0 ; i <= n ; i ++) { for ( w = 0 ; w <= capacity ; w ++) { printf (" %d\t ", dp [ i ][ w ]); } printf (" \n "); } res = dp [ n ][ capacity ]; printf (" Maximum value in the knapsack: %d\n ", res ); w1 = capacity ; printf (" Items included in the knapsack: \n "); for ( i = n ; i > 0 && res > 0 ; i --) { if ( res == dp [ i - 1 ][ w1 ]) { continue ; } else { printf (" Item = %d \t Weight = %d\n ", i , weights [ i - 1 ]); res = res - values [ i - 1 ]; w1 = w1 - weights [ i - 1 ]; } } } int main () { int n , capacity ; int values [ MAX_ITEMS ], weights [ MAX_ITEMS ]; printf (" Enter the number of items: "); scanf (" %d ", & n ); printf (" Enter the weight of each item and their respective values: \n "); for ( int i = 0 ; i < n ; i ++) { scanf (" %d%d ", & weights [ i ], & values [ i ]); } printf (" Enter the capacity of the knapsack: "); scanf (" %d ", & capacity ); knapsack ( values , weights , n , capacity ); return 0 ; } 10. a. Implement all pair shortest paths using Floyd’s algorithm. b. Compute the transi Ɵ ve closure of a given directed graph using Warshall’s algorithm. #include < stdio.h > #include < stdlib.h > int min ( int v1 , int v2 ) { return ( v1 >= v2 ) ? v2 : v1 ; } int main () { int W [ 10 ][ 10 ], D [ 10 ][ 10 ], n , i , j , k ; printf (" Enter the number of Vertices: "); scanf (" %d ", & n ); printf (" Enter the Weight matrix of the given graph row-wise:\n "); for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { scanf (" %d ", & W [ i ][ j ]); D [ i ][ j ] = W [ i ][ j ]; } } for ( k = 0 ; k < n ; k ++) { for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { D [ i ][ j ] = min ( D [ i ][ j ], D [ i ][ k ] + D [ k ][ j ]); } } } printf (" Solution to All Pairs Shortest Distance Problem\n "); printf (" Using Floyd's Algorithm - Distance Matrix of the given graph is: \n "); for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { printf (" %d\t ", D [ i ][ j ]); } printf (" \n "); } return 0 ; } #include < stdio.h > #include < stdlib.h > int main () { int A [ 10 ][ 10 ], T [ 10 ][ 10 ], n , i , j , k ; printf (" Enter the number of Vertices: "); scanf (" %d ", & n ); printf (" Enter the adjacency matrix of the given graph row-wise:\n "); for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { scanf (" %d ", & A [ i ][ j ]); T [ i ][ j ] = A [ i ][ j ]; } } for ( k = 0 ; k < n ; k ++) { for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { T [ i ][ j ] = T [ i ][ j ] || ( T [ i ][ k ] && T [ k ][ j ]); } } } printf (" Transitive Closure of the given graph is:\n "); for ( i = 0 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { printf (" %d\t ", T [ i ][ j ]); } printf (" \n "); } return 0 ; } 11. From a given vertex in a weighted connected graph, find the shortest paths to other ver Ɵ ces using Dijkstra’s algorithm. #include < stdio.h > #define MAX 10 void print_path ( int pred[] , int v , int src ) { if ( v == src ) { printf (" %d ", v ); return ; } print_path ( pred , pred [ v ], src ); printf (" -> %d ", v ); } void print_solution ( int dist[] , int pred[] , int src , int n ) { printf (" Vertex \t Distance \t Path\n "); for ( int i = 0 ; i < n ; i ++) { printf (" %d \t %d \t\t ", i , dist [ i ]); print_path ( pred , i , src ); printf (" \n "); } } int min_distance ( int dist[] , int visited[] , int n ) { int min = 9999 , min_index ; for ( int v = 0 ; v < n ; v ++) { if ( visited [ v ] == 0 && dist [ v ] < min ) { min = dist [ v ]; min_index = v ; } } return min_index ; } void dijkstra ( int graph [ MAX ][ MAX ], int src , int n ) { int dist [ MAX ], visited [ MAX ], pred [ MAX ]; for ( int i = 0 ; i < n ; i ++) { dist [ i ] = 999 ; visited [ i ] = 0 ; pred [ i ] = src ; } dist [ src ] = 0 ; for ( int count = 0 ; count < n - 1 ; count ++) { int u = min_distance ( dist , visited , n ); visited [ u ] = 1 ; for ( int v = 0 ; v < n ; v ++) { if ( visited [ v ] == 0 && graph [ u ][ v ] && dist [ u ] + graph [ u ][ v ] < dist [ v ]) { dist [ v ] = dist [ u ] + graph [ u ][ v ]; pred [ v ] = u ; } } } print_solution ( dist , pred , src , n ); } int main () { int n , graph [ MAX ][ MAX ], src ; printf (" Enter the number of vertices in the graph (maximum %d): ", MAX ); scanf (" %d ", & n ); printf (" Enter the adjacency matrix of the graph (%d x %d):\n ", n , n ); for ( int i = 0 ; i < n ; i ++) { for ( int j = 0 ; j < n ; j ++) { scanf (" %d ", & graph [ i ][ j ]); } } printf (" Enter the source vertex (between 0 and %d): ", n - 1 ); scanf (" %d ", & src ); dijkstra ( graph , src , n ); return 0 ; } 12. Find minimum cost spanning tree of a given undirected graph using Prim’s algorithm. #include < stdio.h > #define MAX 20 int minKey ( int key[] , int mstSet[] , int n ) { int min = 999 , min_index ; for ( int v = 0 ; v < n ; v ++) { if ( mstSet [ v ] == 0 && key [ v ] < min ) { min = key [ v ]; min_index = v ; } } return min_index ; } void printMST ( int parent[] , int graph [ MAX ][ MAX ], int vertices ) { int cost = 0 ; printf (" \nEdge \tWeight\n "); for ( int i = 1 ; i < vertices ; i ++) { printf (" %d - %d \t%d\n ", parent [ i ], i , graph [ i ][ parent [ i ]]); cost += graph [ i ][ parent [ i ]]; } printf (" Cost of the Minimum Spanning Tree (MST) = %d\n ", cost ); } void primMST ( int graph [ MAX ][ MAX ], int n ) { int parent [ MAX ]; int key [ MAX ]; int mstSet [ MAX ]; for ( int i = 0 ; i < n ; i ++) { key [ i ] = 999 ; mstSet [ i ] = 0 ; } key [ 0 ] = 0 ; parent [ 0 ] = - 1 ; for ( int count = 0 ; count < n - 1 ; count ++) { int u = minKey ( key , mstSet , n ); mstSet [ u ] = 1 ; for ( int v = 0 ; v < n ; v ++) { if ( graph [ u ][ v ] && mstSet [ v ] == 0 && graph [ u ][ v ] < key [ v ]) { parent [ v ] = u ; key [ v ] = graph [ u ][ v ]; } } } printMST ( parent , graph , n ); } int main () { int vertices , graph [ MAX ][ MAX ]; printf (" Input the number of vertices: "); scanf (" %d ", & vertices ); printf (" Input the adjacency matrix for the graph: \n "); for ( int i = 0 ; i < vertices ; i ++) { for ( int j = 0 ; j < vertices ; j ++) { scanf (" %d ", & graph [ i ][ j ]); } } primMST ( graph , vertices ); return 0 ; } 13. Find minimum cost spanning tree of a given undirected graph using Kruskal’s algorithm. #include < stdio.h > int i , j , k , a , b , u , v , n , ne = 1 , min , Mcost = 0 , cost [ 10 ][ 10 ], parent [ 10 ]; int find ( int i ) { while ( parent [ i ]) i = parent [ i ]; return i ; } int uni ( int i , int j ) { if ( i != j ) { parent [ j ] = i ; return 1 ; } return 0 ; } int main () { printf (" \n\n Implementation of Kruskal's Algorithm \n\n "); printf (" Input the number of vertices: "); scanf (" %d ", & n ); printf (" Input the adjacency matrix for the graph:\n "); for ( int i = 0 ; i < n ; i ++) { for ( int j = 0 ; j < n ; j ++) { scanf (" %d ", & cost [ i ][ j ]); if ( cost [ i ][ j ] == 0 ) cost [ i ][ j ] = 999 ; } } printf (" \n\n The edges of MST are :\n\n "); printf (" \n\nEdge \tWeight\n "); while ( ne < n ) { for ( i = 0 , min = 999 ; i < n ; i ++) { for ( j = 0 ; j < n ; j ++) { if ( cost [ i ][ j ] < min ) { min = cost [ i ][ j ]; a = u = i ; b = v = j ; } } } u = find ( u ); v = find ( v ); if ( uni ( u , v )) { printf (" \n %d edge (%d - %d ) = %d\n ", ne ++, a , b , min ); Mcost += min ; } cost [ a ][ b ] = cost [ b ][ a ] = 999 ; } printf (" Cost of the Minimum Spanning Tree (MST) = %d\n ", Mcost ); return 0 ; } 14. Find a subset of a given set S = {s1, s2, ...., sn} of n posi Ɵ ve integers whose sum is equal to a given posi Ɵ ve integer d. For example , is S = {1, 2, 5, 6, 8} and d = 9 there are two solu Ɵ ons {1, 2, 6} and {1, 8}. A suitable message is to be displayed if the given problem instance doesn’t have a solu Ɵ on. #include < stdio.h > #include < stdbool.h > void printSubset ( int subset[] , int size ) { printf (" Subset: { "); for ( int i = 0 ; i < size ; i ++) { printf (" %d ", subset [ i ]); } printf (" }\n "); } void sumOfSubsetsUtil ( int weights[] , int targetSum , int n , int subset[] , int subsetSize , int sum , int index ) { if ( sum == targetSum ) { printSubset ( subset , subsetSize ); return ; } for ( int i = index ; i < n ; i ++) { if ( sum + weights [ i ] <= targetSum ) { subset [ subsetSize ] = weights [ i ]; sumOfSubsetsUtil ( weights , targetSum , n , subset , subsetSize + 1 , sum + weights [ i ], i + 1 ); } } } void sumOfSubsets ( int weights[] , int targetSum , int n ) { int subset [ n ]; sumOfSubsetsUtil ( weights , targetSum , n , subset , 0 , 0 , 0 ); } int main () { int n , targetSum ; printf (" Enter the number of elements: "); scanf (" %d ", & n ); int weights [ n ]; printf (" Enter the elements: "); for ( int i = 0 ; i < n ; i ++) { scanf (" %d ", & weights [ i ]); } printf (" Enter the target sum: "); scanf (" %d ", & targetSum ); sumOfSubsets ( weights , targetSum , n ); return 0 ; } 15. Implement N Queen’s problem using back tracking. #include < stdio.h > #include < stdbool.h > #define N 4 void printSolution ( int board [ N ][ N ]) { for ( int i = 0 ; i < N ; i ++) { for ( int j = 0 ; j < N ; j ++) { if ( board [ i ][ j ]) printf (" Q "); else printf (" "); } printf (" \n "); } } bool isSafe ( int board [ N ][ N ], int row , int col ) { int i , j ; for ( i = 0 ; i < col ; i ++) if ( board [ row ][ i ]) return false ; for ( i = row , j = col ; i >= 0 && j >= 0 ; i --, j --) if ( board [ i ][ j ]) return false ; for ( i = row , j = col ; j >= 0 && i < N ; i ++, j --) if ( board [ i ][ j ]) return false ; return true ; } bool solveNQUtil ( int board [ N ][ N ], int col ) { if ( col >= N ) return true ; for ( int i = 0 ; i < N ; i ++) { if ( isSafe ( board , i , col )) { board [ i ][ col ] = 1 ; if ( solveNQUtil ( board , col + 1 ))