Computer Science Of Engineering

Simple and practical computer science tutorials, programming guides, and engineering concepts for students and beginners.

Breaking

Saturday, May 3, 2025

Implement BFT and DFT for given graph, when graph is represented by a) Adjacency Matrix b) Adjacency Lists

 #include <stdio.h>

#include <stdlib.h>


#define MAX 100


// ---------------- Common Queue for BFS ----------------

int queue[MAX], front = -1, rear = -1;


void enqueue(int val) {

    if (rear == MAX - 1) return;

    queue[++rear] = val;

    if (front == -1) front = 0;

}


int dequeue() {

    if (front == -1 || front > rear) return -1;

    return queue[front++];

}


int isQueueEmpty() {

    return front == -1 || front > rear;

}


// ---------------- A. Adjacency Matrix ----------------

int visited[MAX];


void BFS_matrix(int adj[MAX][MAX], int n, int start) {

    for (int i = 0; i < n; i++) visited[i] = 0;


    enqueue(start);

    visited[start] = 1;


    printf("BFS (Adjacency Matrix): ");

    while (!isQueueEmpty()) {

        int node = dequeue();

        printf("%d ", node);


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

            if (adj[node][i] && !visited[i]) {

                enqueue(i);

                visited[i] = 1;

            }

        }

    }

    printf("\n");

}


void DFS_matrix_util(int adj[MAX][MAX], int n, int v) {

    visited[v] = 1;

    printf("%d ", v);

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

        if (adj[v][i] && !visited[i]) {

            DFS_matrix_util(adj, n, i);

        }

    }

}


void DFS_matrix(int adj[MAX][MAX], int n, int start) {

    for (int i = 0; i < n; i++) visited[i] = 0;

    printf("DFS (Adjacency Matrix): ");

    DFS_matrix_util(adj, n, start);

    printf("\n");

}


// ---------------- B. Adjacency List ----------------

struct Node {

    int vertex;

    struct Node* next;

};


struct Node* adjList[MAX];


void addEdge_list(int u, int v) {

    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

    newNode->vertex = v;

    newNode->next = adjList[u];

    adjList[u] = newNode;

}


void BFS_list(int n, int start) {

    for (int i = 0; i < n; i++) visited[i] = 0;

    front = rear = -1;


    enqueue(start);

    visited[start] = 1;


    printf("BFS (Adjacency List): ");

    while (!isQueueEmpty()) {

        int node = dequeue();

        printf("%d ", node);


        struct Node* temp = adjList[node];

        while (temp) {

            if (!visited[temp->vertex]) {

                enqueue(temp->vertex);

                visited[temp->vertex] = 1;

            }

            temp = temp->next;

        }

    }

    printf("\n");

}


void DFS_list_util(int v) {

    visited[v] = 1;

    printf("%d ", v);


    struct Node* temp = adjList[v];

    while (temp) {

        if (!visited[temp->vertex]) {

            DFS_list_util(temp->vertex);

        }

        temp = temp->next;

    }

}


void DFS_list(int n, int start) {

    for (int i = 0; i < n; i++) visited[i] = 0;

    printf("DFS (Adjacency List): ");

    DFS_list_util(start);

    printf("\n");

}


// ---------------- Main ----------------

int main() {

    int n = 5; // number of vertices

    int adj[MAX][MAX] = {0}; // adjacency matrix


    // Sample edges

    int edges[][2] = {{0,1},{0,2},{1,2},{1,3},{3,4}};

    int edgeCount = sizeof(edges)/sizeof(edges[0]);


    // Build Adjacency Matrix and List

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

        int u = edges[i][0];

        int v = edges[i][1];

        adj[u][v] = 1;

        adj[v][u] = 1; // undirected graph


        addEdge_list(u, v);

        addEdge_list(v, u);

    }


    int start = 0; // start vertex


    BFS_matrix(adj, n, start);

    DFS_matrix(adj, n, start);


    BFS_list(n, start);

    DFS_list(n, start);


    return 0;

}

Output:


No comments:

Post a Comment