Perform a topological sort using BFS traversal of a graph using an adjacency matrix.
Difficulty level
This exercise is mostly suitable for students
#include<stdio.h>
#include<stdlib.h>
#define N 20
typedef int element;
typedef struct
{
element data[N]; /* queue content */
int front, length;
} queue;
typedef struct {
int V;
int E;
int **Adj; // since we need 2 dimensional matrix
} Graph;
queue CreateQueue()
{
queue q;
q.front = 0; q.length=0;
return q;
}
int isEmptyQueue(queue q)
{
return q.length == 0;
}
int isFullQueue(queue q)
{
return q.length ==N;
}
int EnQueue(queue *q, element e)
{
if (isFullQueue(*q)) return 0;
q->data[(q->front + q->length)%N] = e;
q->length = q->length + 1;
return 1;
}
int DeQueue(queue *q)
{
if (isEmptyQueue(*q)) return 0;
q->front=(q->front + 1) % N;
q->length--;
return 1;
}
int Front(queue q, element *e)
{
if (isEmptyQueue(q)) return 0;
*e = q.data[q.front];
return 1;
}
Graph* adjacencyMatrix() {
int i, u, v;
Graph* G=(Graph*) malloc(sizeof(Graph));
printf("Enter the number of Vertices: ");
scanf("%d", &G->V);
printf("Enter the number of Edges: ");
scanf("%d", &G->E);
G->Adj = (int **)malloc(G->V * sizeof(int*));
for (u = 0; u < G->V; u++)
G->Adj[u] = (int *)malloc(G->V * sizeof(int));
for (u = 0; u<G->V; u++)
for (v = 0; v<G->V; v++)
G->Adj[u][v] = 0;
for (i = 0; i < G->E; i++) {
printf("Enter the edge: ");
scanf("%d %d", &u,&v);
// for undirected graph, set both
G->Adj[u][v] = 1;
// G->Adj[v][u] = 1;
}
return G;
}
void topologicalSort(Graph *G) {
queue q, topologicalorder;
int counter;
int v, w;
int *indegree;
// Create an array to store indegrees of all
// vertices. Initialize all indegrees as 0.
indegree= (int *)malloc(G->V * sizeof(int));
for (v = 0; v < G->V; v++)
indegree[v] = 0;
// Traverse adjacency lists to fill indegrees of
// vertices. This step takes O(V+E) time
//for each edge(src,dest) in Edges
//indegree[dest]++
for (v = 0; v < G->V; v++)
for (w = 0; w < G->V; w++)
if (G->Adj[v][w] == 1)
indegree[w]++;
q = CreateQueue();
topologicalorder = CreateQueue();
// Initialize count of visited vertices
counter = 0;
for (v = 0; v < G->V; v++)
if (indegree[v]==0)
EnQueue(&q, v);
while (Front(q,&v)) {
DeQueue(&q);
++counter;
EnQueue(&topologicalorder,v );
// Iterate through all its neighbouring nodes
// of dequeued node v and decrease their in-degree
// by 1
for (w = 0; w < G->V; w++)
if (G->Adj[v][w] == 1)
if(--indegree[w] == 0)
EnQueue(&q, w);
}
if (counter != G->V)
printf("Graph has cycle!\n");
while (Front(topologicalorder, &v) && DeQueue(&topologicalorder))
printf("%d ", v);
}
void test() {
int u, v;
Graph *G = adjacencyMatrix();
topologicalSort(G);
}
int main()
{
test();
return 0;
}
Back to the list of exercises
Looking for a more challenging exercise, try this one !!
Binary Search Tree of Events