0% found this document useful (0 votes)
23 views

ADA Lab Program

list of 8 important programs in ada

Uploaded by

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

ADA Lab Program

list of 8 important programs in ada

Uploaded by

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

1.

MST Using Kruskals Algorithm


#include <stdio.h>

#include <stdlib.h>

int comparator(const void* p1, const void* p2)

const int(*x)[3] = p1;

const int(*y)[3] = p2;

return (*x)[2] - (*y)[2];

void makeSet(int parent[], int rank[], int n)

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

parent[i] = i;

rank[i] = 0;

int findParent(int parent[], int component)

if (parent[component] == component)

return component;

return parent[component]

= findParent(parent, parent[component]);

void unionSet(int u, int v, int parent[], int rank[], int n)

u = findParent(parent, u);

v = findParent(parent, v);

if (rank[u] < rank[v]) {

parent[u] = v;

else if (rank[u] > rank[v]) {


parent[v] = u;

else {

parent[v] = u;

rank[u]++;

void kruskalAlgo(int n, int edge[n][3])

qsort(edge, n, sizeof(edge[0]), comparator);

int parent[n];

int rank[n];

makeSet(parent, rank, n);

int minCost = 0;

printf(

"Following are the edges in the constructed MST\n");

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

int v1 = findParent(parent, edge[i][0]);

int v2 = findParent(parent, edge[i][1]);

int wt = edge[i][2];

if (v1 != v2) {

unionSet(v1, v2, parent, rank, n);

minCost += wt;

printf("%d -- %d == %d\n", edge[i][0],

edge[i][1], wt);

printf("Minimum Cost Spanning Tree: %d\n", minCost);

}
int main()

int edge[5][3] = { { 0, 1, 10 },

{ 0, 2, 6 },

{ 0, 3, 5 },

{ 1, 3, 15 },

{ 2, 3, 4 } };

kruskalAlgo(5, edge);

return 0;

2.MST using Prims Algorithm

#include <limits.h>

#include <stdbool.h>

#include <stdio.h>

#define V 5

int minKey(int key[], bool mstSet[])

int min = INT_MAX, min_index;

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

if (mstSet[v] == false && key[v] < min)

min = key[v], min_index = v;

return min_index;

int printMST(int parent[], int graph[V][V])

printf("Edge \tWeight\n");

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

printf("%d - %d \t%d \n", parent[i], i,

graph[i][parent[i]]);

}
void primMST(int graph[V][V])

int parent[V];

int key[V];

bool mstSet[V];

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

key[i] = INT_MAX, mstSet[i] = false;

key[0] = 0;

parent[0] = -1;

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

int u = minKey(key, mstSet);

mstSet[u] = true;

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

if (graph[u][v] && mstSet[v] == false

&& graph[u][v] < key[v])

parent[v] = u, key[v] = graph[u][v];

printMST(parent, graph);

int main()

int graph[V][V] = { { 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 } };

primMST(graph);

return 0;

3a.Floyds Algorithm

#include <stdio.h>

#define V 4

#define INF 99999

void printSolution(int dist[][V]);

void floydWarshall(int dist[][V])

int i, j, k;

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

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

for (j = 0; j < V; j++) {

if (dist[i][k] + dist[k][j] < dist[i][j])

dist[i][j] = dist[i][k] + dist[k][j];

printSolution(dist);

void printSolution(int dist[][V])

printf(

"The following matrix shows the shortest distances"

" between every pair of vertices \n");

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


for (int j = 0; j < V; j++) {

if (dist[i][j] == INF)

printf("%7s", "INF");

else

printf("%7d", dist[i][j]);

printf("\n");

int main()

int graph[V][V] = { { 0, 5, INF, 10 },

{ INF, 0, 3, INF },

{ INF, INF, 0, 1 },

{ INF, INF, INF, 0 } };

floydWarshall(graph);

return 0;

3b.Warshalls Using C++

#include<stdio.h>

#define V 4

void printSolution(int reach[][V]);

void transitiveClosure(int graph[][V])

int reach[V][V], i, j, k;

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

for (j = 0; j < V; j++)

reach[i][j] = graph[i][j];

for (k = 0; k < V; k++)

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

for (j = 0; j < V; j++)

reach[i][j] = reach[i][j] ||

(reach[i][k] && reach[k][j]);


}

printSolution(reach);

void printSolution(int reach[][V])

printf ("Following matrix is transitive");

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

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

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

if(i == j)

printf("1 ");

else

printf ("%d ", reach[i][j]);

printf("\n");

int main()

int graph[V][V] = { {1, 1, 0, 1},

{0, 1, 1, 0},

{0, 0, 1, 1},

{0, 0, 0, 1}

};

transitiveClosure(graph);

return 0;

4.Dijkistras Algorithm

#include <limits.h>

#include <stdbool.h>

#include <stdio.h>
#define V 9

int minDistance(int dist[], bool sptSet[])

int min = INT_MAX, min_index;

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

if (sptSet[v] == false && dist[v] <= min)

min = dist[v], min_index = v;

return min_index;

void printSolution(int dist[])

printf("Vertex \t\t Distance from Source\n");

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

printf("%d \t\t\t\t %d\n", i, dist[i]);

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

int dist[V];

bool sptSet[V];

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

dist[i] = INT_MAX, sptSet[i] = false;

dist[src] = 0;

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

int u = minDistance(dist, sptSet);

sptSet[u] = true;

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

if (!sptSet[v] && graph[u][v]

&& dist[u] != INT_MAX

&& dist[u] + graph[u][v] < dist[v])

dist[v] = dist[u] + graph[u][v];

printSolution(dist);
}

int main()

int graph[V][V] = { { 0, 4, 0, 0, 0, 0, 0, 8, 0 },

{ 4, 0, 8, 0, 0, 0, 0, 11, 0 },

{ 0, 8, 0, 7, 0, 4, 0, 0, 2 },

{ 0, 0, 7, 0, 9, 14, 0, 0, 0 },

{ 0, 0, 0, 9, 0, 10, 0, 0, 0 },

{ 0, 0, 4, 14, 10, 0, 2, 0, 0 },

{ 0, 0, 0, 0, 0, 2, 0, 1, 6 },

{ 8, 11, 0, 0, 0, 0, 1, 0, 7 },

{ 0, 0, 2, 0, 0, 0, 6, 7, 0 } };

dijkstra(graph, 0);

return 0;

5. Topological Sort
#include <stdbool.h>

#include <stdio.h>

#include <stdlib.h>

struct Stack {

int data;

struct Stack* next;

};

struct Graph {

int V;

struct List* adj;

};

struct List {

int data;
struct List* next;

};

struct Stack* createStackNode(int data)

struct Stack* newNode

= (struct Stack*)malloc(sizeof(struct Stack));

newNode->data = data;

newNode->next = NULL;

return newNode;

struct List* createListNode(int data)

struct List* newNode

= (struct List*)malloc(sizeof(struct List));

newNode->data = data;

newNode->next = NULL;

return newNode;

struct Graph* createGraph(int V)

struct Graph* graph

= (struct Graph*)malloc(sizeof(struct Graph));

graph->V = V;

graph->adj

= (struct List*)malloc(V * sizeof(struct List));

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

graph->adj[i].next = NULL;

return graph;

}
void addEdge(struct Graph* graph, int v, int w)

struct List* newNode = createListNode(w);

newNode->next = graph->adj[v].next;

graph->adj[v].next = newNode;

void topologicalSortUtil(struct Graph* graph, int v,

bool visited[],

struct Stack** stack)

visited[v] = true;

struct List* current = graph->adj[v].next;

while (current != NULL) {

int adjacentVertex = current->data;

if (!visited[adjacentVertex]) {

topologicalSortUtil(graph, adjacentVertex,

visited, stack);

current = current->next;

struct Stack* newNode = createStackNode(v);

newNode->next = *stack;

*stack = newNode;

void topologicalSort(struct Graph* graph)

struct Stack* stack = NULL;

bool* visited = (bool*)malloc(graph->V * sizeof(bool));


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

visited[i] = false;

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

if (!visited[i]) {

topologicalSortUtil(graph, i, visited, &stack);

while (stack != NULL) {

printf("%d ", stack->data);

struct Stack* temp = stack;

stack = stack->next;

free(temp);

free(visited);

free(graph->adj);

free(graph);

int main()

struct Graph* g = createGraph(6);

addEdge(g, 5, 2);

addEdge(g, 5, 0);

addEdge(g, 4, 0);

addEdge(g, 4, 1);

addEdge(g, 2, 3);

addEdge(g, 3, 1);
printf("Topological Sorting Order: ");

topologicalSort(g);

return 0;

6.Knapsack 0/1 using dynamic memory method

#include <stdio.h>

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

int knapSack(int W, int wt[], int val[], int n)

if (n == 0 || W == 0)

return 0;

if (wt[n - 1] > W)

return knapSack(W, wt, val, n - 1);

else

return max(

val[n - 1]

+ knapSack(W - wt[n - 1], wt, val, n - 1),

knapSack(W, wt, val, n - 1));

int main()

int profit[] = { 60, 100, 120 };

int weight[] = { 10, 20, 30 };

int W = 50;

int n = sizeof(profit) / sizeof(profit[0]);

printf("%d", knapSack(W, weight, profit, n));

return 0;

7. Discrete and continuous knapsack

#include <bits/stdc++.h>

using namespace std;

struct Item {

double ratio;
int index;

};

bool compare(Item a, Item b) { return a.ratio > b.ratio; }

int knapsack_greedy(int N, int W, vector<int>& values,

vector<int>& weights)

vector<Item> ratios(N);

for (int i = 0; i < N; i++) {

ratios[i].ratio

= static_cast<double>(values[i]) / weights[i];

ratios[i].index = i;

sort(ratios.begin(), ratios.end(), compare);

int total_value = 0;

int total_weight = 0;

for (const auto& item : ratios) {

int index = item.index;

if (total_weight + weights[index] <= W) {

total_value += values[index];

total_weight += weights[index];

return total_value;

int main()

int N = 3;

int W = 4;

vector<int> values = { 1, 2, 3 };

vector<int> weights = { 4, 5, 1 };

int result = knapsack_greedy(N, W, values, weights);


cout << result << endl;

return 0;

8. Subset of a given set

#include <stdio.h>

#include <stdbool.h>

bool isSubsetSum(int set[], int n, int sum)

if (sum == 0)

return true;

if (n == 0)

return false;

if (set[n - 1] > sum)

return isSubsetSum(set, n - 1, sum);

return isSubsetSum(set, n - 1, sum)

|| isSubsetSum(set, n - 1, sum - set[n - 1]);

int main()

int set[] = { 3, 34, 4, 12, 5, 2 };

int sum = 9;

int n = sizeof(set) / sizeof(set[0]);

if (isSubsetSum(set, n, sum) == true)

printf("Found a subset with given sum");

else

printf("No subset with given sum");

return 0;

You might also like