0% found this document useful (0 votes)
2 views13 pages

ADA Lab External

The document provides implementations of various algorithms including Kruskal's, Prim's, Floyd's, Warshall's, Dijkstra's, Topological Sort, 0/1 Knapsack, Discrete Knapsack, Subset Sum, Selection Sort, and Quick Sort. Each algorithm is presented with C code, explaining its functionality and providing examples of input and output. The algorithms cover a range of topics in graph theory, dynamic programming, and sorting techniques.

Uploaded by

MJ Manu
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)
2 views13 pages

ADA Lab External

The document provides implementations of various algorithms including Kruskal's, Prim's, Floyd's, Warshall's, Dijkstra's, Topological Sort, 0/1 Knapsack, Discrete Knapsack, Subset Sum, Selection Sort, and Quick Sort. Each algorithm is presented with C code, explaining its functionality and providing examples of input and output. The algorithms cover a range of topics in graph theory, dynamic programming, and sorting techniques.

Uploaded by

MJ Manu
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/ 13

1.

Kruskal’s algorithm
#include <stdio.h>
#define MAX 100
#define INF 9999

int parent[MAX];
int find(int i) {
while (parent[i])
i = parent[i];
return i;
}

int unionSets(int i, int j) {


int u = find(i), v = find(j);
if (u != v) {
parent[v] = u;
return 1;
}
return 0;
}

int main() {
int cost[MAX][MAX], n, i, j, a, b, u, v, ne = 1, min, mincost = 0;
printf("Enter number of vertices: ");
scanf("%d", &n);
printf("Enter the cost adjacency matrix :\n");
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
scanf("%d", &cost[i][j]),
cost[i][j] = (cost[i][j] == 0) ? INF : cost[i][j];
printf("\nEdges in Minimum Spanning Tree:\n");

while (ne < n) {


min = INF;
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;
if (unionSets(u, v)) {
printf("Edge %d: (%d, %d) cost = %d\n", ne++, a, b, min);
mincost += min;
}
cost[a][b] = cost[b][a] = INF;
}
printf("\nMinimum Cost = %d\n", mincost);
return 0;
}
2.Prim’s algorithm
#include <stdio.h>
#define INF 99999
#define MAX 10
int G[MAX][MAX] = {
{0, 19, 8},
{21, 0, 13},
{15, 18, 0}
};
int S[MAX][MAX], n = 3;

int prims() {
int dist[MAX], from[MAX], visited[MAX] = {1}, min_cost = 0;
int i, j, u, v, min_dist, edges = n - 1;
for (i = 0; i < n; i++) {
dist[i] = G[0][i] ? G[0][i] : INF;
from[i] = 0;
for (j = 0; j < n; j++)
S[i][j] = 0;
}
while (edges--) {
min_dist = INF;
for (i = 1; i < n; i++)
if (!visited[i] && dist[i] < min_dist)
min_dist = dist[v = i];
u = from[v];
S[u][v] = S[v][u] = G[u][v];
min_cost += G[u][v];
visited[v] = 1;
for (i = 1; i < n; i++)
if (!visited[i] && G[v][i] && G[v][i] < dist[i]) {
dist[i] = G[v][i];
from[i] = v;
}
}
return min_cost;
}
int main() {
int i, j, cost = prims();
printf("Spanning tree:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf("%d\t", S[i][j]);
printf("\n");
}
printf("Minimum cost = %d\n", cost);
return 0;
}
3a.Floyd’s algorithm
#include <stdio.h>
#define V 4
#define INF 9999

void floydWarshall(int graph[V][V]) {


int dist[V][V];
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
dist[i][j] = graph[i][j];
for (int k = 0; k < V; k++)
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
if (dist[i][k] != INF && dist[k][j] != INF &&
dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
if (dist[i][j] == INF)
printf("No path exists between %d and %d\n", i, j);
else
printf("Shortest path from %d to %d is %d\n", i, j, dist[i][j]);
}

int main() {
int graph[V][V] = {
{0, 1, INF, INF},
{INF, 0, 2, INF},
{6, INF, 0, 3},
{3, -5, INF, 0}
};

floydWarshall(graph);
return 0;
}
3b.Warshal’s algorithm
#include <stdio.h>
#define MAX 10
int n;
int adj[MAX][MAX], reach[MAX][MAX];

void warshall() {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
reach[i][j] = adj[i][j];
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (reach[i][k] && reach[k][j])
reach[i][j] = 1;
}

int main() {
printf("Enter number of nodes: ");
scanf("%d", &n);

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


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

printf("\nTransitive Closure Matrix:\n");


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

4.Dijkstra’s algorithm
#include <stdio.h>
#include <stdbool.h>
#define V 5
#define INF 99999
int minDistance(int dist[], bool visited[]) {
int min = INF, min_index = -1;
for (int i = 0; i < V; i++)
if (!visited[i] && dist[i] < min)
min = dist[i], min_index = i;
return min_index;
}

void dijkstra(int graph[V][V], int src) {


int dist[V];
bool visited[V];
for (int i = 0; i < V; i++)
dist[i] = INF, visited[i] = false;
dist[src] = 0;

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


int u = minDistance(dist, visited);
visited[u] = true;
for (int v = 0; v < V; v++)
if (!visited[v] && graph[u][v] && dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}

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


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

int main() {
int graph[V][V] = {
{0, 9, 6, 5, 3},
{9, 0, 0, 0, 0},
{6, 0, 0, 0, 0},
{5, 0, 0, 0, 0},
{3, 0, 0, 0, 0}
};
dijkstra(graph, 0);
return 0;
}

5.Topological algorithm
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int adj[MAX][MAX];
int in_degree[MAX];
int n;

void topologicalSort() {
int queue[MAX], front = 0, rear = 0;
int count = 0;
for (int i = 0; i < n; i++) {
if (in_degree[i] == 0)
queue[rear++] = i;
}
printf("Topological Order: ");
while (front < rear) {
int v = queue[front++];
printf("%d ", v);
count++;
for (int i = 0; i < n; i++) {
if (adj[v][i] == 1) {
in_degree[i]--;
if (in_degree[i] == 0)
queue[rear++] = i;
}
}
}
if (count != n) {
printf("\nCycle detected! Topological sorting is not possible.\n");
}
printf("\n");
}

int main() {
int edges, u, v;
printf("Enter number of vertices: ");
scanf("%d", &n);
printf("Enter number of edges: ");
scanf("%d", &edges);
for (int i = 0; i < n; i++) {
in_degree[i] = 0;
for (int j = 0; j < n; j++) {
adj[i][j] = 0;
}
}

printf("Enter edges (u v) where u -> v:\n");


for (int i = 0; i < edges; i++) {
scanf("%d %d", &u, &v);
adj[u][v] = 1;
in_degree[v]++;
}
topologicalSort();
return 0;
}
6. 0/1 Knapsack

#include <stdio.h>

int weight[10], profit[10], n;


int max(int a, int b) {
return (a > b) ? a : b;
}

int knapsack(int capacity) {


int dp[10][20];
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= capacity; w++) {
if (i == 0 || w == 0)
dp[i][w] = 0;
else if (weight[i - 1] <= w)
dp[i][w] = max(dp[i - 1][w], profit[i - 1] + dp[i - 1][w - weight[i - 1]]);
else
dp[i][w] = dp[i - 1][w];
}
}
return dp[n][capacity];
}

int main() {
int capacity, max_profit;
printf("Enter number of items: ");
scanf("%d", &n);
printf("Enter profit and weight of each object:\n");
for (int i = 0; i < n; i++) {
printf("Item %d - Profit and Weight: ", i + 1);
scanf("%d %d", &profit[i], &weight[i]);
}
printf("Enter knapsack capacity: ");
scanf("%d", &capacity);
max_profit = knapsack(capacity);
printf("\nMaximum profit = %d\n", max_profit);
return 0;
}
7.discrete Knapsack

#include<stdio.h>

int main()
{
float weight[50],profit[50],ratio[50],Totalvalue,temp,capacity,amount;
int n,i,j;
printf("Enter the number of items :");
scanf("%d",&n);
for (i = 0; i < n; i++)
{
printf("Enter Weight and Profit for item[%d] :\n",i);
scanf("%f %f", &weight[i], &profit[i]);
}
printf("Enter the capacity of knapsack :\n");
scanf("%f",&capacity);

for(i=0;i<n;i++)
ratio[i]=profit[i]/weight[i];
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
if (ratio[i] < ratio[j])
{
temp = ratio[j];
ratio[j] = ratio[i];
ratio[i] = temp;
temp = weight[j];
weight[j] = weight[i];
weight[i] = temp;
temp = profit[j];
profit[j] = profit[i];
profit[i] = temp;
}
printf("Knapsack problems using Greedy Algorithm:\n");
for (i = 0; i < n; i++)
{
if (weight[i] > capacity)
break;
else
{
Totalvalue = Totalvalue + profit[i];
capacity = capacity - weight[i];
}
}
if (i < n)
Totalvalue = Totalvalue + (ratio[i]*capacity);
printf("\nThe maximum value is :%f\n",Totalvalue);
return 0;
}
8.Subset

#include <stdio.h>
#include <stdbool.h>

int set[100], subset[100];


int n, target;
bool found = false;

void findSubset(int index, int currSum, int subsetSize) {


if (currSum == target) {
found = true;
printf("Subset found: ");
for (int i = 0; i < subsetSize; i++) {
printf("%d ", subset[i]);
}
printf("\n");
return;
}

if (index >= n || currSum > target)


return;
subset[subsetSize] = set[index];
findSubset(index + 1, currSum + set[index], subsetSize + 1);
if (found) return;
findSubset(index + 1, currSum, subsetSize);
}

int main() {
printf("Enter number of elements: ");
scanf("%d", &n);
printf("Enter the elements: ");
for (int i = 0; i < n; i++) {
scanf("%d", &set[i]);
}
printf("Enter the target sum: ");
scanf("%d", &target);
findSubset(0, 0, 0);
if (!found)
printf("No subset with sum %d found.\n", target);
return 0;
}
9.Selection Sort

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

int main() {
int a[10000], i, j, temp, num;
clock_t st, et;

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


scanf("%d", &num);

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


a[i] = rand() % 10000;
}

printf("Array before sorting:\n");


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

st = clock();

for (i = 0; i < num - 1; i++) {


for (j = i + 1; j < num; j++) {
if (a[i] > a[j]) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}

et = clock();

printf("Array after sorting:\n");


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

double time_taken = ((double)(et - st)) * 1000 / CLOCKS_PER_SEC;


printf("Time taken: %.3f ms\n", time_taken);

return 0;
}
10.Quick Sort
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int partition(int arr[], int low, int high) {


int pivot = arr[low];
int i = low;
for (int j = low + 1; j <= high; j++) {
if (arr[j] <= pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i];
arr[i] = arr[low];
arr[low] = temp;
return i;
}

void quickSort(int arr[], int low, int high) {


if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void generateRandomNumbers(int arr[], int n) {
for (int i = 0; i < n; i++) {
arr[i] = rand() % 100000;
}
}

int main() {
int n_values[] = {5000, 10000, 20000, 50000, 100000};
int num_tests = sizeof(n_values) / sizeof(n_values[0]);
printf("n\tTime Taken (ms)\n");
for (int i = 0; i < num_tests; i++) {
int n = n_values[i];
int *arr = (int *)malloc(n * sizeof(int));
generateRandomNumbers(arr, n);
clock_t start = clock();
quickSort(arr, 0, n - 1);
clock_t end = clock();
double time_taken_ms = ((double)(end - start)) * 1000 / CLOCKS_PER_SEC;
printf("%d\t%.3f ms\n", n, time_taken_ms);
free(arr);
}
return 0;
}
11.Merge Sort
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void merge(int arr[], int l, int m, int r) {


int n1 = m - l + 1, 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) arr[k++] = (L[i] <= R[j]) ? L[i++] : 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 - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r);
}
}
void generateRandomNumbers(int arr[], int n) {
srand(time(NULL));
for (int i = 0; i < n; i++)
arr[i] = rand() % 10000;
}
void printArray(int arr[], int n) {
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
}

int main() {
int n;
printf("Enter the number of elements: ");
scanf("%d", &n);
int arr[n];
generateRandomNumbers(arr, n);
printf("\nUnsorted array:\n");
printArray(arr, n);
clock_t start = clock();
mergeSort(arr, 0, n - 1);
clock_t end = clock();
printf("\nSorted array:\n");
printArray(arr, n);
double time_taken = (double)(end - start) / CLOCKS_PER_SEC;
printf("\nTime taken to sort %d elements = %f seconds\n", n,
time_taken);
return 0;
}
12.N Queen’s
#include <stdbool.h>
#include <stdio.h>
#define N 8

void printSolution(int board[N][N]) {


for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf("%d ", board[i][j]);
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))
return true;
board[i][col] = 0;
}
}
return false;
}
bool solveNQ() {
int board[N][N] = { {0} };
if (solveNQUtil(board, 0) == false) {
printf("Solution does not exist");
return false;
}
printSolution(board);
return true;
}
int main() {
solveNQ();
return 0;
}

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy