[go: up one dir, main page]

0% found this document useful (0 votes)
10 views19 pages

ADA Lab Programs

Uploaded by

vk.cysec
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
10 views19 pages

ADA Lab Programs

Uploaded by

vk.cysec
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 19

1.

Kruskal:

#include <stdio.h>

int i, j, k, a, b, u, v, n, ne = 1;
int min, mincost = 0;

int find(int i, int parent[]) {


while (parent[i] != 0)
i = parent[i];
return i;
}

int uni(int i, int j, int parent[]) {


if (i != j) {
parent[j] = i;
return 1;
}
return 0;
}

int main() {
int cost[10][10];
int parent[10];

printf("Implementation of Kruskal's algorithm\n");


printf("Enter the number of vertices: ");
scanf("%d", &n);

for (i = 1; i <= n; i++)


parent[i] = 0;

printf("\nEnter the cost adjacency matrix:\n");


for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
scanf("%d", &cost[i][j]);
if (cost[i][j] == 0)
cost[i][j] = 999;
}
}

printf("The edges of Minimum Cost Spanning Tree are:\n");


while (ne < n) {
min = 999;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (cost[i][j] < min) {
min = cost[i][j];
a = u = i;
b = v = j;
}
}
}
u = find(u, parent);
v = find(v, parent);
if (uni(u, v, parent) == 1) {
printf("Edge (%d, %d) = %d\n", a, b, min);
ne++;
mincost += min;
}
cost[a][b] = cost[b][a] = 999;
}

printf("Minimum cost = %d\n", mincost);

return 0;
}

2. Prims

#include <stdio.h>

int n, i, j, ne = 1;
int a, b, u, v;

int main() {
int visited[10];
int cost[10][10];
int min, mincost = 0;

printf("\n Enter the number of nodes: ");


scanf("%d", &n);

for (i = 1; i <= n; i++)


visited[i] = 0;

printf("\n Enter the adjacency matrix:\n");


for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
scanf("%d", &cost[i][j]);
if (cost[i][j] == 0)
cost[i][j] = 999;
}
}

visited[1] = 1;
while (ne < n) {
min = 999;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (cost[i][j] < min) {
if (visited[i] != 0) {
min = cost[i][j];
a = u = i;
b = v = j;
}
}
}
}
if (visited[u] == 0 || visited[v] == 0) {
printf(" Edge %d: %d,%d cost: %d\n", ne, u, v, min);
ne++;
mincost += min;
visited[b] = 1;
}
cost[a][b] = cost[b][a] = 999;
}
printf(" Minimum cost = %d\n", mincost);

return 0;
}

3a.Floyds

#include <stdio.h>
#include <limits.h>

#define MAX 10

void floyds(int cost[MAX][MAX], int n) {


int i, j, k;
for (k = 0; k < n; k++)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i == j)
cost[i][j] = 0;
else
cost[i][j] = (cost[i][j] < (cost[i][k] + cost[k][j])) ? cost[i][j] : (cost[i][k] + cost[k][j]);
}

int main() {
int cost[MAX][MAX];
int n, i, j;

printf("Enter the number of vertices: ");


scanf("%d", &n);

printf("Enter the cost matrix:\n");


for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
scanf("%d", &cost[i][j]);

floyds(cost, n);

printf("Transitive closure for the given cost matrix is:\n");


for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("\t%d", cost[i][j]);
printf("\n");
}

return 0;
}

3b. Warshall's

#include <stdio.h>

#define MAX 10

void warshall(int graph[MAX][MAX], int n) {


int i, j, k;
int transitiveClosure[MAX][MAX];
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
transitiveClosure[i][j] = graph[i][j];

for (k = 0; k < n; k++) {


for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
transitiveClosure[i][j] = transitiveClosure[i][j] || (transitiveClosure[i][k] &&
transitiveClosure[k][j]);
}
}
}

printf("Transitive closure of the given graph:\n");


for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("%d ", transitiveClosure[i][j]);
}
printf("\n");
}
}

int main() {
int n, i, j;
int graph[MAX][MAX];

printf("Enter the number of vertices: ");


scanf("%d", &n);

printf("Enter the adjacency matrix:\n");


for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &graph[i][j]);
}
}

warshall(graph, n);

return 0;
}
4. Dijkstra's

#include <stdio.h>
#define MAX 20
#define INFINITY 9999

int n;
int cost[MAX][MAX];
int distance[MAX];
int visited[MAX];

void readMatrix() {
printf("Enter the number of vertices: ");
scanf("%d", &n);
printf("Enter the cost adjacency matrix:\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] = INFINITY;
}
}
}
}

int extractMin() {
int min = INFINITY, minIndex = -1;
for (int i = 0; i < n; i++) {
if (!visited[i] && distance[i] < min) {
min = distance[i];
minIndex = i;
}
}
return minIndex;
}

void dijkstra(int startVertex) {


for (int i = 0; i < n; i++) {
distance[i] = cost[startVertex][i];
visited[i] = 0;
}
distance[startVertex] = 0;
visited[startVertex] = 1;
for (int count = 1; count < n; count++) {
int u = extractMin();
visited[u] = 1;

for (int v = 0; v < n; v++) {


if (!visited[v] && distance[u] + cost[u][v] < distance[v]) {
distance[v] = distance[u] + cost[u][v];
}
}
}

printf("Vertex\tDistance from Source\n");


for (int i = 0; i < n; i++) {
printf("%d\t%d\n", i, distance[i]);
}
}

int main() {
readMatrix();
int startVertex;
printf("Enter starting vertex: ");
scanf("%d", &startVertex);
dijkstra(startVertex);
return 0;
}

5.Topological

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

// Adjacency list node


struct AdjListNode {
int dest;
struct AdjListNode* next;
};

// Adjacency list
struct AdjList {
struct AdjListNode *head;
};
// Graph structure
struct Graph {
int V;
struct AdjList* array;
};

// Create a new adjacency list node


struct AdjListNode* newAdjListNode(int dest) {
struct AdjListNode* newNode = (struct AdjListNode*) malloc(sizeof(struct AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}

// Create a graph of V vertices


struct Graph* createGraph(int V) {
struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
graph->V = V;

graph->array = (struct AdjList*) malloc(V * sizeof(struct AdjList));

for (int i = 0; i < V; ++i)


graph->array[i].head = NULL;

return graph;
}

// Add an edge to a directed graph


void addEdge(struct Graph* graph, int src, int dest) {
struct AdjListNode* newNode = newAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
}

// A recursive function to perform DFS and push vertices to stack


void topologicalSortUtil(int v, int visited[], int stack, int *stackIndex, struct Graph graph) {
visited[v] = 1;
struct AdjListNode* node = graph->array[v].head;

while (node != NULL) {


if (!visited[node->dest])
topologicalSortUtil(node->dest, visited, stack, stackIndex, graph);
node = node->next;
}
stack[*stackIndex] = v;
(*stackIndex)++;
}

// The function to perform Topological Sort


void topologicalSort(struct Graph* graph) {
int stack[MAX];
int stackIndex = 0;
int visited[MAX] = {0};

for (int i = 0; i < graph->V; i++) {


if (visited[i] == 0) {
topologicalSortUtil(i, visited, stack, &stackIndex, graph);
}
}

for (int i = stackIndex - 1; i >= 0; i--) {


printf("%d ", stack[i]);
}
}

int main() {
int V = 6; // Number of vertices
struct Graph* graph = createGraph(V);
addEdge(graph, 5, 2);
addEdge(graph, 5, 0);
addEdge(graph, 4, 0);
addEdge(graph, 4, 1);
addEdge(graph, 2, 3);
addEdge(graph, 3, 1);

printf("Topological sorting of the given graph is: \n");


topologicalSort(graph);

return 0;
}

6. 0/1 Knapsack

#include <stdio.h>

int max(int a, int b) {


return (a > b) ? a : b;
}

int main() {
int p[20], w[20], v[20][20];
int i, j, n, W;

printf("Enter the number of items: ");


scanf("%d", &n);

for (i = 1; i <= n; i++) {


printf("Enter the weight and profit of item %d: ", i);
scanf("%d %d", &w[i], &p[i]);
}

printf("\nEnter the capacity of the knapsack: ");


scanf("%d", &W);

for (i = 0; i <= n; i++) {


v[i][0] = 0;
}
for (j = 0; j <= W; j++) {
v[0][j] = 0;
}

for (i = 1; i <= n; i++) {


for (j = 1; j <= W; j++) {
if (w[i] > j) {
v[i][j] = v[i - 1][j];
} else {
v[i][j] = max(v[i - 1][j], v[i - 1][j - w[i]] + p[i]);
}
}
}

printf("The maximum profit is %d\n", v[n][W]);

printf("\nThe items selected are:\n");


j = W;
for (i = n; i >= 1; i--) {
if (v[i][j] != v[i - 1][j]) {
printf("\tItem: %d\n", i);
j = j - w[i];
}
}

return 0;
}

7. Knapsack Greedy

#include <stdio.h>

#define MAX 20

typedef struct {
float w; // weight
float p; // profit
float r; // profit/weight ratio
} KObject;

int n;
float M;

void ReadObjects(KObject obj[]) {


KObject temp;
printf("Enter the max capacity of knapsack: ");
scanf("%f", &M);
printf("Enter Weights: ");
for (int i = 0; i < n; i++) {
scanf("%f", &obj[i].w);
}
printf("Enter Profits: ");
for (int i = 0; i < n; i++) {
scanf("%f", &obj[i].p);
}
for (int i = 0; i < n; i++) {
obj[i].r = obj[i].p / obj[i].w;
}
// sort objects in descending order, based on p/w ratio
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (obj[j].r < obj[j + 1].r) {
temp = obj[j];
obj[j] = obj[j + 1];
obj[j + 1] = temp;
}
}
}
}

void Knapsack(KObject kobj[]) {


float x[MAX] = {0}; // solution vector
float totalProfit = 0;
float U = M; // remaining capacity
int i;
for (i = 0; i < n; i++) {
if (kobj[i].w > U) {
break;
} else {
x[i] = 1;
totalProfit += kobj[i].p;
U -= kobj[i].w;
}
}
if (i < n) {
x[i] = U / kobj[i].w;
totalProfit += x[i] * kobj[i].p;
}
printf("The Solution vector, x[]: ");
for (i = 0; i < n; i++) {
printf("%f ", x[i]);
}
printf("\nTotal profit is = %f\n", totalProfit);
}

int main() {
printf("Enter number of objects: ");
scanf("%d", &n);
KObject obj[n];
ReadObjects(obj);
Knapsack(obj);
return 0;
}

8. Subset

#include <stdio.h>

#define MAX 10

int d;
int s[MAX];
int x[MAX];

void sumOfSub(int m, int k, int r, int n) {


x[k] = 1;
if ((m + s[k]) == d) {
printf("Subset:\n");
for (int i = 1; i <= k; i++) {
if (x[i] == 1) {
printf("\t%d\n", s[i]);
}
}
} else {
if ((m + s[k] + s[k + 1]) <= d && (k + 1 <= n)) {
sumOfSub(m + s[k], k + 1, r - s[k], n);
}
if ((m + r - s[k] >= d) && (m + s[k + 1] <= d) && (k + 1 <= n)) {
x[k] = 0;
sumOfSub(m, k + 1, r - s[k], n);
}
}
}

int main() {
int n, sum = 0;
printf("Enter the size of the set: ");
scanf("%d", &n);

printf("\nEnter the set in increasing order:\n");


for (int i = 1; i <= n; i++) {
scanf("%d", &s[i]);
}

printf("\nEnter the value of d: ");


scanf("%d", &d);

for (int i = 1; i <= n; i++) {


sum += s[i];
}

if (sum < d || s[1] > d) {


printf("No subset possible\n");
} else {
sumOfSub(0, 1, sum, n);
}

return 0;
}

9. Selection Sort

#include <stdio.h>
void selection_sort(int arr[], int n) {
int i, j, min_index;
for (i = 0; i < n - 1; i++) {
min_index = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[min_index]) {
min_index = j;
}
}
int temp = arr[i];
arr[i] = arr[min_index];
arr[min_index] = temp;
}
}

int main() {
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
int array[n];
printf("Enter %d numbers:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &array[i]);
}
selection_sort(array, n);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
10. Quick Sort

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_SIZE 1000

void input(int a[], int *n) {


printf("Enter the total numbers: ");
scanf("%d", n);
srand(time(NULL));
for (int i = 0; i < *n; i++) {
a[i] = rand() % 1000;
}
}

void display(int a[], int n) {


for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
}

void quicksort(int a[], int left, int right);

void sort(int a[], int n) {


quicksort(a, 0, n - 1);
}

void quicksort(int a[], int left, int right) {


if (left < right) {
int pivot = a[left];
int i = left;
int j = right + 1;
do {
do {
i++;
} while (i < right && a[i] < pivot);
do {
j--;
} while (a[j] > pivot);
if (i < j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
} while (i < j);
int temp = a[left];
a[left] = a[j];
a[j] = temp;
quicksort(a, left, j - 1);
quicksort(a, j + 1, right);
}
}

int main() {
int a[MAX_SIZE];
int n;
input(a, &n);
printf("Array before sorting\n");
display(a, n);
clock_t startTime = clock();
sort(a, n);
clock_t endTime = clock();
double duration = ((double)(endTime - startTime)) * 1000 / CLOCKS_PER_SEC;
printf("\nArray After sorting\n");
display(a, n);
printf("\nTime for sorting is %.2f milli seconds\n", duration);
return 0;
}

11. Merge Sort

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void mergesort(int arr[], int left, int right);


void merge(int arr[], int left, int mid, int right);
void display(int arr[], int size);

int main() {
int n;
printf("Enter the total numbers: ");
scanf("%d", &n);
int arr[n];
srand(time(NULL));
for (int i = 0; i < n; i++) {
arr[i] = rand() % 1000;
}
printf("Array before sorting\n");
display(arr, n);

clock_t start = clock();


mergesort(arr, 0, n - 1);
clock_t end = clock();
double duration = ((double) (end - start)) / CLOCKS_PER_SEC * 1000;

printf("\nArray after sorting\n");


display(arr, n);

printf("\nTime for sorting is %.6f milliseconds\n", duration);


return 0;
}

void mergesort(int arr[], int left, int right) {


if (left < right) {
int mid = left + (right - left) / 2;
mergesort(arr, left, mid);
mergesort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}

void merge(int arr[], int left, int mid, int right) {


int temp[right - left + 1];
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (i = left, k = 0; i <= right; i++, k++) {
arr[i] = temp[k];
}
}

void display(int arr[], int size) {


for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}

12. N Queens problem

#include <stdio.h>
#include <stdlib.h>

#define MAX 20

int board[MAX][MAX];

void printSolution(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%c ", board[i][j] ? 'Q' : '.');
}
printf("\n");
}
printf("\n");
}

int isSafe(int row, int col, int n) {


int i, j;
for (i = 0; i < col; i++) {
if (board[row][i]) {
return 0;
}
}
for (i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i][j]) {
return 0;
}
}
for (i = row, j = col; j >= 0 && i < n; i++, j--) {
if (board[i][j]) {
return 0;
}
}
return 1;
}

int solveNQUtil(int col, int n) {


if (col >= n) {
printSolution(n);
return 1;
}
int res = 0;
for (int i = 0; i < n; i++) {
if (isSafe(i, col, n)) {
board[i][col] = 1;
res = solveNQUtil(col + 1, n) || res;
board[i][col] = 0;
}
}
return res;
}

void solveNQ(int n) {
if (!solveNQUtil(0, n)) {
printf("Solution does not exist\n");
return;
}
}

int main() {
int n;
printf("Enter the number of queens: ");
scanf("%d", &n);
solveNQ(n);
return 0;
}

You might also like