-
Notifications
You must be signed in to change notification settings - Fork 24
/
VishruthS_Q36_DFS_traversal.c
106 lines (90 loc) · 2.55 KB
/
VishruthS_Q36_DFS_traversal.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
//CSL201 DATA STRUCTURES LAB ----- VISHRUTH S, CS3A, 61
//CYCLE 7 QUESTION 1
//Program to perfom Depth First Traversal on a graph
//represented using the adjacency matrix
#include <stdio.h>
#include <stdbool.h>
#define V 11
// ====== Stack and its functions ====== //
const int stackSize = 100;
int stack[100];
int top = -1;
void stackPush(int);
int stackPop();
bool stackEmpty();
// ================ DEPTH FIRST TRAVERSAL ============== //
// Time complexity: O(V*V) (when using adjacency matrix of V vertices)
void depthFirstTraversal(int graph[][V], int u)
{
int visited[V] = {0}; // to keep track of visited nodes
stackPush(u); // push starting node into the stack
int curr_node;
while (!stackEmpty())
{
curr_node = stackPop(); // get a node from top of the stack
if (visited[curr_node] == 0) // if it is not visited
{
printf("%d -> ", curr_node); // print its value
visited[curr_node] = 1; // and mark as visited
}
for (int i = 0; i < V; i++) // for every node in the graph
if (graph[curr_node][i] == 1 && visited[i] == 0) // if it is adjacent and not visited
stackPush(i); // push it into the stack
}
}
void addEdge(int[][V], int, int);
// === MAIN FUNCTION === //
int main()
{
int graph[V][V] = {0}; // initiliazing Adjacency Matrix
addEdge(graph, 1, 2); // adding edges between graph nodes
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 2, 5);
addEdge(graph, 2, 7);
addEdge(graph, 2, 8);
addEdge(graph, 3, 4);
addEdge(graph, 3, 10);
addEdge(graph, 3, 9);
addEdge(graph, 5, 6);
addEdge(graph, 5, 7);
addEdge(graph, 5, 8);
addEdge(graph, 7, 8);
// graph for reference
// 6
// /
// 1 5
// / \ / | \
// 4 2 ---- 7
// \ / \ | /
// 3 8
// / \
// 9 10
printf("\nDepth first traversal from node 1\n");
depthFirstTraversal(graph, 1);
printf("\n");
return 0;
}
// Function to add an edge between two vertices of an Undirected graph
void addEdge(int graph[][V], int u, int v)
{
graph[u][v] = 1;
graph[v][u] = 1;
}
// ========= Stack functions ======== //
void stackPush(int data)
{
if (top == stackSize - 1)
return;
stack[++top] = data;
}
int stackPop()
{
if (stackEmpty())
return -1;
return stack[top--];
}
bool stackEmpty()
{
return top == -1;
}