ADSA Lab Manual
ADSA Lab Manual
ALGORITHMS LABORATORY
I SEMESTER – R 2021
LABORATORY MANUAL
Ex.NO: 1: Implementation of recursive function for tree
traversal and Fibonacci
1A: Tree Traversal using Recursive:
Algorithm
Algorithm Inorder(tree)
1. Traverse the left subtree, i.e., call Inorder(left-subtree)
2. Visit the root.
3. Traverse the right subtree, i.e., call Inorder(right-subtree) Algorithm
Preorder(tree)
1. Visit the root.
2. Traverse the left subtree, i.e., call Preorder(left-subtree)
3. Traverse the right subtree, i.e., call Preorder(right-subtree)
Algorithm Postorder(tree)
1. Traverse the left subtree, i.e., call Postorder(left-subtree) 2.
Traverse the right subtree, i.e., call Postorder(right-subtree)
3. Visit the root.
return 0;
}
Output
Alternate
#include <iostream>
using namespace std;
Node(int data)
{ this->data = data;
this->left = this->right = nullptr;
}
};
// Display the data part of the root (or current node) cout
<< root->data << " ";
int main()
{
/* Construct the following tree
1
/\
/ \
2 3
/ / \
/ / \
4 5 6
/\
/\
7 8
*/
preorder(root);
return 0;
}
Output
12435786
Algorithm
1. START
2. Input the non-negative integer ‘n’
3. If (n==o || n==1) return n;
else
return fib(n-1)+fib(n-2);
4. Print, nth Fibonacci number
5. END
5
#include<iostream> using
namespace std; void
printFibonacci(int n){
static int n1=0, n2=1, n3;
if(n>0){ n3 = n1 + n2;
n1 = n2; n2 = n3;
cout<<n3<<" "; printFibonacci(n-1);
}
} int
main(){
int n;
cout<<"Enter the number of elements: "; cin>>n;
cout<<"Fibonacci Series: "; cout<<"0 "<<"1 "; printFibonacci(n-
2); //n-2 because 2 numbers are already printed
return 0;
}
Output
Enter the number of elements: 10
Fibonacci Series: 0 1 1 2 3 5 8 13 21 34
6
Algorithm
1) Create an empty stack S.
2) Initialize current node as root
3) Push the current node to S and set current = current->left until current is NULL
4) If current is NULL and stack is not empty then
a) Pop the top item from stack.
b) Print the popped item, set current = popped_item->right
c) Go to step 3.
5) If current is NULL and stack is empty then we are done.
#include <iostream>
#include <stack>
using namespace std;
Node(int data)
{ this->data = data;
this->left = this->right = nullptr; }
};
// push the right child of the popped node into the stack
if (curr->right) { stack.push(curr->right);
}
// push the left child of the popped node into the stack
if (curr->left) { stack.push(curr->left);
}
// the right child must be pushed first so that the left child
// is processed first (LIFO order)
}
}
int main() {
/* Construct the following tree
1
/\
/ \
2 3
/ /\
/ / \
4 5 6
/\
/\
7 8
*/
return 0;
}
Output
12435786
2B: Fibonacci with Iteration
8
#include <iostream>
using namespace std;
int main() {
int n1=0,n2=1,n3,i,number;
cout<<"Enter the number of elements: ";
cin>>number;
cout<<n1<<" "<<n2<<" "; //printing 0 and 1
for(i=2;i<number;++i) //loop starts from 2 because 0 and 1 are already printed
{
n3=n1+n2;
cout<<n3<<"
"; n1=n2;
n2=n3;
} return 0;
}
Output
Enter the number of elements: 9
0 1 1 2 3 5 8 13 21
9
Algorithm
• The MergeSort function repeatedly divides the array into two halves until we reach a
stage where we try to perform MergeSort on a subarray of size 1 i.e. p == r.
• After that, the merge function comes into play and combines the sorted arrays into
larger arrays until the whole array is merged.
#include<iostream> using
namespace std;
void swapping(int &a, int &b) { //swap the content of a and b
int temp;
temp = a;
a = b; b =
temp;
}
void display(int *array, int size) {
for(int i = 0; i<size; i++)
cout << array[i] << " ";
cout << endl;
}
void merge(int *array, int l, int m, int r) { int
i, j, k, nl, nr;
//size of left and right sub-arrays
nl = m-l+1; nr = r-m; int
larr[nl], rarr[nr];
//fill left and right sub-arrays
for(i = 0; i<nl; i++) larr[i] =
array[l+i];
for(j = 0; j<nr; j++)
rarr[j] = array[m+1+j];
i = 0; j = 0; k = l;
//marge temp arrays to real array while(i
< nl && j<nr) {
if(larr[i] <= rarr[j]) {
array[k] = larr[i];
i++;
}else{ array[k] =
rarr[j]; j++; } k++;
}
while(i<nl) { //extra element in left array
array[k] = larr[i];
i++; k++;
10
}
while(j<nr) { //extra element in right array
array[k] = rarr[j]; j++;
k++;
}
}
void mergeSort(int *array, int l, int r) {
int m; if(l
< r) {
int m = l+(r-l)/2;
// Sort first and second arrays
mergeSort(array, l, m);
mergeSort(array, m+1, r);
merge(array, l, m, r);
}
} int main()
{
int n;
cout << "Enter the number of elements: "; cin
>> n;
int arr[n]; //create an array with given number of elements cout
<< "Enter elements:" << endl;
for(int i = 0; i<n; i++) {
cin >> arr[i];
}
cout << "Array before Sorting: ";
display(arr, n);
mergeSort(arr, 0, n-1); //(n-1) for last index cout <<
"Array after Sorting: ";
display(arr, n);
}
Output
Enter the number of elements: 5 Enter
elements:
94178
Array before Sorting: 9 4 1 7 8
Array after Sorting: 1 4 7 8 9
Algorithm
1. An array is divided into subarrays by selecting a pivot element (element selected from
the array).
11
While dividing the array, the pivot element should be positioned in such a way that
elements less than pivot are kept on the left side and elements greater than pivot are
on the right side of the pivot.
2. The left and right subarrays are also divided using the same approach. This process
continues until each subarray contains a single element.
3. At this point, elements are already sorted. Finally, elements are combined to form a
sorted array. #include <iostream> using namespace std;
for(i=0;i<n;i++)
cin>>a[i];
quick_sort(a,0,n-1); cout<<"\nArray
after sorting:";
for(i=0;i<n;i++) cout<<a[i]<<"
";
return 0;
}
void quick_sort(int a[],int l,int u)
{ int j;
if(l<u
)
{ j=partition(a,l,u);
quick_sort(a,l,j-1);
quick_sort(a,j+1,u)
;
}
}
int partition(int a[],int l,int u)
{ int v,i,j,temp;
v=a[l]; i=l;
j=u+1;
do
{
do
i++;
while(a[i]<v&&i<=u);
12
do
j--;
while(v<a[j]);
if(i<j)
{ temp=a[i];
a[i]=a[j];
a[j]=temp
;
}
}while(i<j);
a[l]=a[j];
a[j]=v;
return(j);
}
Output
How many elements?7
Algorithm
A binary search tree follows some order to arrange the elements. In a Binary search
tree, the value of left node must be smaller than the parent node, and the value of right node
must be greater than the parent node. This rule is applied recursively to the left and right
subtrees of the root.
Search in BST
#include<iostream> using
namespace std;
node* left;
node* right;
};
node* root;
node* makeEmpty(node* t) {
if(t == NULL)
return NULL;
{ makeEmpty(t->left);
makeEmpty(t-
>right);
delete t;
} return
NULL;
}
node* findMin(node* t)
{ if(t == NULL)
return NULL;
else if(t->left == NULL)
return t;
else return findMin(t-
>left);
}
node* findMax(node* t) {
if(t == NULL)
return NULL;
else if(t->right == NULL)
return t;
else
return findMax(t->right);
15
return t;
}
void inorder(node* t) {
if(t == NULL) return;
inorder(t->left); cout
<< t->data << " ";
inorder(t->right);
}
public:
BST() {
root = NULL;
}
16
~BST() { root =
makeEmpty(root);
}
void insert(int x) {
root = insert(x, root);
}
void remove(int x) {
root = remove(x, root);
}
void display() {
inorder(root)
; cout <<
endl;
}
void search(int x) {
root = find(root, x);
}
};
int main() {
BST t;
t.insert(20);
t.insert(25);
t.insert(15);
t.insert(10);
t.insert(30);
t.display();
t.remove(20);
t.display();
t.remove(25);
t.display();
t.remove(30);
t.display(); return
0;
}
Output
10 15 25 30 70
10 15 25 30 70
10 15 30 70
10 15 70
17
Algorithm
Left Rotate
In left-rotation, the arrangement of the nodes on the right is transformed into the
arrangements on the left node. Algorithm
Right Rotate
In right-rotation, the arrangement of the nodes on the left is transformed into the
arrangements on the right node.
In left-right rotation, the arrangements are first shifted to the left and then to the right.
1. Do left rotation on x-
y. Left rotate x-y
d. If any of the above cases do not occur, then do the following. Case-IV:
. Set the color of w as the color of the parent of x.
a. Set the color of the parent of x as BLACK.
b. Set the color of the right child of w as BLACK.
c. Left-Rotate the parent of x.
d. Set x as the root of the tree.
3. Else the same as above with right changed to left and vice versa.
4. Set the color of x as BLACK.
#include <cstdlib>
#include <stdexcept>
#include <iostream>
using namespace std;
~RedBlack()
{
DeleteNode(root);
}
parent = NULL;
node = root;
while (node)
{ parent =
node; if (key
< node->key)
{ node = node-
>left;
} else
{ node = node-
>right;
}
}
if (!parent)
23
root->colour = BLACK;
}
Colour original;
Node *sub, *old;
if (!node->left)
{
Transplant(node, sub = node->right);
} else if (!node-
>right)
{
Transplant(node, sub = node->left);
} else
{ old = Minimum(node-
>right); original = old-
>colour;
sub = old->right;
if (old->parent == node)
{ sub->parent = node;
} else
{
Transplant(old, old->right);
old->right = node->right;
old->right->parent = old;
}
if (sibling->colour == RED)
{ sibling->colour = BLACK; old->parent->colour = RED;
side ? RotateLeft(old->parent) : RotateRight(old->parent);
sibling = side ? old->parent->right : old->parent->left; }
26
sibling->colour = old->parent->colour;
old->parent->colour = BLACK;
if (side)
{
sibling->left->colour = BLACK; RotateLeft(old->parent);
} else
{
sibling->right->colour = BLACK; RotateRight(old->parent);
}
old = root;
}
}
}
}
void Dump()
{
Dump(root, 0);
}
private: enum
Colour
{
RED,
27
BLACK
};
struct Node
{
Colour colour;
Key key;
Value value;
Node *parent;
Node *left;
Node *right;
};
Node *root;
y = x->right; x->right
= y->left; if (y->left)
{ y->left->parent =
x;
}
if (!x->parent)
{ root =
y; }
else if (x == x->parent->left)
{ x->parent->left =
y; } else
{ x->parent->right =
y; } x->parent = y;
}
x = y->left; y-
>left = x->right; if
(x->right)
{ x->right->parent =
y;
28
if (!y->parent)
{ root =
x; }
else if (y == y->parent->left)
{ y->parent->left =
x; } else
{ y->parent->right =
x;
}
y->parent = x;
}
if (src)
{ src->parent = dest-
>parent;
}
}
return tree;
}
29
if (node->left)
{
DeleteNode(node->left);
}
if (node->right)
{
DeleteNode(node->right);
}
delete node;
}
};
int main()
{ RedBlack<int, int> tree;
for (int i = 1; i < 10; ++i)
{ tree.Insert(i,
i); }
tree.Delete(9);
tree.Delete(8);
30
tree.Dump();
return 0;
}
Output
1B
2R
3B
4B
5B 6R
7R
31
Max-heap Min-heap
Heap Operations
Some of the important operations performed on a heap are described below along with
their algorithms. Heapify
Heapify is the process of creating a heap data structure from a binary tree. It is used to create
a Min-Heap or a Max-Heap.
1. Let the input array be
32
Initial
Array
Algorithm
Heapify(array, size, i)
set i as largest
leftChild = 2i + 1
rightChild = 2i + 2
2. Swap it with the last element. Swap with the last element
For Min Heap, above algorithm is modified so that both childNodes are greater smaller
than currentNode.
Extract-Max/Min
Extract-Max returns the node with maximum value after removing it from a Max Heap whereas
Extract-Min returns the node with minimum after removing it from Min Heap /* C++ Program
to Implement Heap
*/
#include <iostream>
#include <cstdlib>
#include <vector>
#include <iterator>
using namespace std ;
/*
36
* Class Declaration
*/ class
Heap
{ private:
vector <int> heap; int left(int
parent); int right(int parent); int
parent(int child); void
heapifyup(int index); void
heapifydown(int index);
public:
Heap() {} void Insert(int
element); void
DeleteMin(); int Extract
Min(); void DisplayHeap();
int Size();
};
/*
* Return Heap Size
*/ int
Heap::Size()
{ return heap.size();
}
/*
* Insert Element into a Heap
*/ void Heap::Insert(int element)
{
heap.push_back(element); heapifyup(heap.size() -1);
}
/*
* Delete Minimum Element
*/ void
Heap::DeleteMin()
{ if (heap.size() == 0)
{
cout<<"Heap is Empty"<<endl;
return; }
heap[0] = heap.at(heap.size() - 1);
heap.pop_back(); heapifydown(0);
cout<<"Element Deleted"<<endl;
}
/*
* Extract Minimum Element
*/ int Heap::Extract
Min()
{ if (heap.size() == 0)
37
{ return -1; }
else
return heap.front();
}
/*
* Display Heap
*/ void
Heap::DisplayHeap()
{ vector <int>::iterator pos = heap.begin();
cout<<"Heap --> ";
while (pos != heap.end())
{
cout<<*pos<<" "; pos++;
}
cout<<endl;
}
/*
* Return Left Child
*/ int Heap::left(int parent)
{ int l = 2 * parent + 1; if (l
< heap.size())
return l;
else
return -1;
}
/*
* Return Right Child
*/ int Heap::right(int parent)
{ int r = 2 * parent + 2; if (r
< heap.size()) return r;
else return -1;
}
/*
* Return Parent
*/
int Heap::parent(int child)
{ int p = (child - 1)/2; if
(child == 0) return -1;
else return p;
}
/*
* Heapify- Maintain Heap Structure bottom up
38
/*
* Heapify- Maintain Heap Structure top down
*/ void Heap::heapifydown(int in)
{
/*
* Main Contains Menu
*/ int
main()
{
Heap h; while
(1)
{ cout<<" ------------------ "<<endl;
cout<<"Operations on Heap"<<endl; cout<<" -----
------------- "<<endl; cout<<"1.Insert
Element"<<endl; cout<<"2.Delete Minimum
Element"<<endl; cout<<"3.Extract Minimum
Element"<<endl; cout<<"4.Print Heap"<<endl;
cout<<"5.Exit"<<endl; int choice, element;
cout<<"Enter your choice: "; cin>>choice;
switch(choice)
{ case
1:
cout<<"Enter the element to be inserted: "; cin>>element;
39
h.Insert(element); break;
case 2:
h.DeleteMin(); break;
case 3:
cout<<"Minimum Element: "; if
(h.Extract Min() == -1)
{
cout<<"Heap is Empty"<<endl;
} else
cout<<"Minimum Element: "<<h.Extract Min()<<endl;
break;
case 4:
cout<<"Displaying elements of Hwap: "; h.DisplayHeap();
break;
case 5:
exit(1);
default:
cout<<"Enter Correct Choice"<<endl;
}
} return
0;
}
Output
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 1
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 1
40
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap 5.Exit
Enter your choice: 1
Enter the element to be inserted: 3
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 4
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap 5.Exit
Enter your choice: 1
Enter the element to be inserted: 5
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 1
Enter the element to be inserted: 9
41
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 4
Displaying elements of Hwap: Heap --> 1 2 3 4 5 9
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap 5.Exit
Enter your choice: 1
Enter the element to be inserted: 7
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 4
Displaying elements of Hwap: Heap --> 1 2 3 4 5 9 7
Operations on Heap
1.Insert Element
2.Delete Minimum Element
3.Extract Minimum Element
4.Print Heap
5.Exit
Enter your choice: 2
Element Deleted
Operations on Heap
1.Insert Element
42
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap 5.Exit
Enter your choice: 3
Minimum Element: Minimum Element: 2
Operations on Heap
1. Insert Element
2. Delete Minimum Element
3.Extract Minimum Element
4.Print Heap 5.
Exit
Enter your choice:
43
Inserting a node into an already existing heap follows the steps below.
insert(H, x)
degree[x] = 0
p[x] = NIL
child[x] = NIL
left[x] = x
right[x] = x
mark[x] = FALSE
concatenate the root list containing x with root list H if
min[H] == NIL or key[x] < key[min[H]]
then min[H] = x
n[H] = n[H] + 1
Following functions
44
/*
* C++ Program to Implement Fibonacci Heap
*/
#include <iostream>
#include <cmath> #include
<cstdlib>
using namespace std;
/*
* Node Declaration
*/ struct
node
{ int n; int
degree;
node* parent;
node* child;
node* left;
node* right;
char mark;
char C;
};
/*
* Class Declaration
45
*/ class
FibonacciHeap
{ private: int
nH; node
*H;
public: node* InitializeHeap(); int
Fibonnaci_link(node*, node*, node*);
node *Create_node(int); node
*Insert(node *, node *); node
*Union(node *, node *); node
*Extract_Min(node *); int
Consolidate(node *); int Display(node *);
node *Find(node *, int); int
Decrease_key(node *, int, int); int
Delete_key(node *,int); int Cut(node *,
node *, node *); int Cascase_cut(node *,
node *);
FibonacciHeap() {
H = InitializeHeap();
}
}; /*
* Initialize Heap
*/ node*
FibonacciHeap::InitializeHeap()
{ node* np;
np = NULL; return
np;
}
/*
* Create Node
*/ node* FibonacciHeap::Create_node(int
value)
{ node* x = new node;
x->n = value; return
x;
}
/*
* Insert Node
*/ node* FibonacciHeap::Insert(node* H, node*
x)
{ x->degree = 0;
x->parent =
NULL; x-
>child =
NULL; x-
>left = x; x-
>right = x; x-
>mark = 'F';
46
x->C = 'N'; if
(H != NULL)
{
(H->left)->right = x;
x->right = H; x->left =
H->left; H->left = x; if
(x->n < H->n) H = x; }
else
{
H = x; }
nH = nH + 1;
return H;
}
/*
* Link Nodes in Fibonnaci Heap
*/ int FibonacciHeap::Fibonnaci_link(node* H1, node* y, node*
z)
{
(y->left)->right = y->right;
(y->right)->left = y->left;
if (z->right == z)
H1 = z; y->left = y;
y->right = y; y->parent
= z; if (z->child ==
NULL) z->child = y;
y->right = z->child; y->left
= (z->child)->left; ((z-
>child)->left)->right = y; (z-
>child)->left = y; if (y->n <
(z->child)->n)
z->child = y;
z->degree++;
}
/*
* Union Nodes in Fibonnaci Heap
*/
node* FibonacciHeap::Union(node* H1, node* H2)
{ node* np;
node* H
=
Initialize
Heap();
H = H1;
(H->left)->right = H2;
(H2->left)->right = H;
np = H->left; H->left
= H2->left; H2->left =
np; return H;
}
47
/*
* Display Fibonnaci Heap
*/ int FibonacciHeap::Display(node*
H)
{ node* p = H; if
(p == NULL)
{ cout<<"The Heap is Empty"<<endl;
return 0;
}
cout<<"The root nodes of Heap are: "<<endl;
do
{ cout<<p->n;
p = p->right;
if (p != H)
{ cout<<"-->";
}}
while (p != H && p->right != NULL); cout<<endl;
}
/*
* Extract Min Node in Fibonnaci Heap
*/
node* FibonacciHeap::Extract_Min(node* H1)
{ node* p;
node* ptr;
node* z =
H1; p = z;
ptr = z;
if (z == NULL) return
z;
node* x; node* np; x =
NULL; if (z->child !=
NULL)
x = z->child;
if (x != NULL)
{ ptr = x;
do
{ np = x->right; (H1-
>left)->right = x; x-
>right = H1; x->left =
H1->left; H1->left =
x; if (x->n < H1->n)
H1 = x; x-
>parent = NULL; x =
np; } while (np != ptr);
}
(z->left)->right = z->right;
(z->right)->left = z->left; H1
= z->right;
if (z == z->right && z->child == NULL)
48
H = NULL;
else
{
H1 = z->right;
Consolidate(H1)
; } nH = nH - 1;
return p;
}
/*
* Consolidate Node in Fibonnaci Heap
*/ int FibonacciHeap::Consolidate(node*
H1)
{ int d, i; float f = (log(nH)) /
(log(2)); int D = f;
node* A[D];
for (i = 0; i <= D; i++)
A[i] = NULL;
node* x = H1;
node* y; node*
np; node* pt = x;
do
{ pt = pt->right; d = x-
>degree; while (A[d]
!= NULL)
{ y = A[d]; if (x-
>n > y->n)
{ np = x; x =
y; y = np; }
if (y == H1)
H1 = x;
Fibonnaci_link(H1, y, x);
if (x->right == x)
H1 = x;
A[d] = NULL; d
= d + 1;
} A[d] = x; x
= x->right; }
while (x != H1);
H = NULL;
for (int j = 0; j <= D; j++)
{ if (A[j] != NULL)
{
A[j]->left = A[j]; A[j]->right
=A[j];
if (H != NULL)
{
(H->left)->right = A[j];
A[j]->right = H;
49
A[j]->left = H-
>left; H->left =
A[j]; if (A[j]->n <
H->n)
H = A[j];
} else
{
H = A[j];
}
if(H == NULL)
H = A[j]; else if
(A[j]->n < H->n) H =
A[j];
}
}
}
/*
* Decrease key of Nodes in Fibonnaci Heap
*/ int FibonacciHeap::Decrease_key(node*H1, int x, int
k)
{ node* y;
if (H1 == NULL)
{ cout<<"The Heap is Empty"<<endl;
return 0; }
node* ptr = Find(H1, x); if
(ptr == NULL)
{ cout<<"Node not found in the Heap"<<endl;
return 1; }
if (ptr->n < k)
{ cout<<"Entered key greater than current key"<<endl;
return 0; }
ptr->n = k; y =
ptr->parent;
if (y != NULL && ptr->n < y->n)
{
Cut(H1, ptr, y);
Cascase_cut(H1, y);
}
if (ptr->n < H->n)
H = ptr; return
0;
}
/*
* Cut Nodes in Fibonnaci Heap
*/ int FibonacciHeap::Cut(node* H1, node* x, node*
y)
{ if (x == x->right)
50
y->child = NULL;
(x->left)->right = x->right;
(x->right)->left = x->left;
if (x == y->child)
y->child = x->right;
y->degree = y->degree - 1;
x->right = x; x->left = x;
(H1->left)->right = x; x-
>right = H1; x->left = H1-
>left; H1->left = x; x-
>parent = NULL; x->mark
= 'F';
}
/*
* Cascade Cutting in Fibonnaci Heap
*/ int FibonacciHeap::Cascase_cut(node* H1,
node* y)
{ node* z = y->parent;
if (z != NULL)
{ if (y->mark == 'F')
{ y->mark = 'T';
} else
{
Cut(H1, y, z);
Cascase_cut(H1, z);
}
}
}
/*
* Find Nodes in Fibonnaci Heap
*/ node* FibonacciHeap::Find(node* H,
int k)
{ node* x = H;
x->C = 'Y'; node*
p = NULL; if (x-
>n == k)
{ p = x; x->C =
'N'; return p; }
if (p == NULL)
{ if (x->child != NULL ) p
= Find(x->child, k);
if ((x->right)->C != 'Y' )
p = Find(x->right, k);
51
} x->C =
'N'; return
p;
}
/*
* Delete Nodes in Fibonnaci Heap
*/
int FibonacciHeap::Delete_key(node* H1, int k)
{
node* np = NULL;
int t;
t = Decrease_key(H1, k, -5000);
if (!t)
np = Extract_Min(H);
if (np != NULL)
cout<<"Key Deleted"<<endl; else
cout<<"Key not Deleted"<<endl;
return 0;
}
/*
* Main Contains Menu
*/ int
main()
{ int n, m, l;
FibonacciHeap fh;
node* p; node* H;
H = fh.InitializeHeap(); while
(1)
{
cout<<" "<<endl;
cout<<"Operations on Binomial heap"<<endl;
cout<<" "<<endl;
cout<<"1)Insert Element in the heap"<<endl;
cout<<"2)Extract Minimum key node"<<endl;
cout<<"3)Decrease key of a node"<<endl;
cout<<"4)Delete a node"<<endl;
cout<<"5)Display Heap"<<endl;
cout<<"6)Exit"<<endl; cout<<"Enter Your
Choice: ";
cin>>l; switch(l) { case 1: cout<<"Enter the
element to be inserted: ";
cin>>m; p =
fh.Create_node(m); H
= fh.Insert(H, p);
break;
case 2:
p = fh.Extract_Min(H); if
(p != NULL)
52
Output
Operations on Binomial heap
void Graph::DFS(int v)
{
// Mark the current node as visited and
// print it
visited[v] = true;
cout << v << " ";
// Recur for all
55
the vertices
adjacent
// to this vertex list<int>::iterator
i;
for (i = adj[v].begin(); i != adj[v].end(); ++i) if
(!visited[*i])
DFS(*i);
}
return 0;
}
Output
2013
Algorithm
BFS algorithm
A standard BFS implementation puts each vertex of the graph into one of two categories:
1. Visited
2. Not Visited
The purpose of the algorithm is to mark each vertex as visited while avoiding cycles.
The algorithm works as follows:
1. Start by putting any one of the graph's vertices at the back of a queue.
2. Take the front item of the queue and add it to the visited list.
3. Create a list of that vertex's adjacent nodes. Add the ones which aren't in the visited list
to the back of the queue.
4. Keep repeating steps 2 and 3 until the queue is empty.
56
The graph might have two different disconnected parts so to make sure that we cover every
vertex, we can also run the BFS algorithm on every node
Graph::Graph(int V)
{ this->V = V; adj = new
list<int>[V];
}
void Graph::BFS(int s) {
// Mark all the vertices as not visited
bool *visited = new bool[V]; for(int
i = 0; i < V; i++) visited[i] = false;
while(!queue.empty()) {
// Dequeue a vertex from queue and print it
s = queue.front(); cout << s << " ";
queue.pop_front();
return 0;
}
Output
2031
58
Algorithm
• A minimum spanning tree is a spanning tree in which the sum of the weight of the
edges is as minimum as possible.
Kruskal's algorithm
We start from the edges with the lowest weight and keep adding edges until we reach our goal.
The steps for implementing Kruskal's algorithm are as follows:
1. Sort all the edges from low weight to high
2. Take the edge with the lowest weight and add it to the spanning tree. If adding the edge
created a cycle, then reject this edge.
3. Keep adding edges until we reach all vertices.
// Constructor
Graph(int V, int E)
{ this->V = V; this-
>E = E;
}
// Constructor.
DisjointSets(int n)
{
// Allocate memory
this->n = n; parent =
new int[n+1]; rnk =
new int[n+1];
int Graph::kruskalMST()
{ int mst_wt = 0; // Initialize result
return mst_wt;
}
// Driver program to test above functions int
main()
{
/* Let us create above shown
weighted and undirected graph */ int
V = 9, E = 14; Graph g(V, E);
61
return 0;
}
Output
Edges of MST are
6-7
2-8
5-6
0-1
2-5
2-3
0-7
3-4
Weight of MST is 37
62
printArr(dist, V);
return;
}
>edge[5].dest = 2; graph-
>edge[5].weight = 5;
// add edge 3-1 (or D-B in above figure)
graph->edge[6].src = 3; graph-
>edge[6].dest = 1; graph-
>edge[6].weight = 1;
BellmanFord(graph, 0);
return 0;
}
Output
Vertex Distance from Source
0 0
1 -1
2 2
3 -2
4 1
function dijkstra(G, S)
for each vertex V in G
distance[V] <- infinite
previous[V] <- NULL
If V != S, add V to Priority Queue Q distance[S]
<- 0
#include <iostream>
using namespace std;
#include <limits.h>
// A utility function to find the vertex with minimum distance value, from
// the set of vertices not yet included in shortest path tree int
minDistance(int dist[], bool sptSet[])
{
return min_index;
}
// Pick the minimum distance vertex from the set of vertices not
// yet processed. u is always equal to src in the first iteration. int
u = minDistance(dist, sptSet);
// Mark the picked vertex as processed
sptSet[u] = true;
// Update dist value of the adjacent vertices of the picked vertex. for
(int v = 0; v < V; v++)
return 0;
}
Output
Vertex Distance from Source
0 3
1 4
2 4
3 7
4 21
68
5 11
6 9
7 8
8 14
69
Algorithm matOrder(array,
n)
Input − List of matrices, the number of matrices in the list.
Output − Minimum number of matrix multiplication.
Begin define table minMul of size n x n, initially fill with
all 0s for length := 2 to n, do for i:=1 to n-length, do
j := i + length – 1
minMul[i, j] := ∞ for k
:= i to j-1, do
q := minMul[i, k] + minMul[k+1, j] + array[i-1]*array[k]*array[j]
if q < minMul[i, j], then minMul[i, j] := q done done
done
return minMul[1, n-1] End
getchar();
return 0;
}
Ouput
Minimum number of multiplications is 18
EX.NO: 12: Activity Selection and Huffman Coding
Implementation
Algorithm
Input Data for the Algorithm:
• act[] array containing all the activities.
• s[] array containing the starting time of all the activities.
• f[] array containing the finishing time of all the activities.
Ouput Data from the Algorithm:
• sol[] array refering to the solution set containing the maximum number of non-
conflicting activities.
Steps for Activity Selection Problem
Following are the steps we will be following to solve the activity selection problem, Step
1: Sort the given activities in ascending order according to their finishing time.
Step 2: Select the first activity from sorted array act[] and add it to sol[] array.
Step 3: Repeat steps 4 and 5 for the remaining activities in act[].
71
Step 4: If the start time of the currently selected activity is greater than or equal to the finish
time of previously selected activity, then add it to the sol[] array.
Step 5: Select the next activity in act[] array.
Step 6: Print the sol[] array.
#include <bits/stdc++.h>
// Structure represents an activity having start time and finish time. struct
Activity
{ int start, finish;
};
// This function is used for sorting activities according to finish time bool
Sort_activity(Activity s1, Activity s2)
{ return (s1.finish< s2.finish);
}
print_Max_Activities(arr, N);
return 0;
}
Output
Enter the start and end time of 1 activity
12
Enter the start and end time of 2 activity
34
Enter the start and end time of 3 activity
06
Enter the start and end time of 4 activity 5
7
Enter the start and end time of 5 activity 5
9
Enter the start and end time of 6 activity
89
Following activities are selected
(1, 2)
(3, 4)
(5, 7)
(8, 9)