Cascasc
Cascasc
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
// Queue structure for BFS
struct Queue {
int items[SIZE];
int front;
int rear;
};
// Graph structure
struct Graph {
int numVertices;
int** adjMatrix;
int* visited;
};
// Function to create a queue
struct Queue* createQueue() {
struct Queue* q = (struct Queue*)malloc(sizeof(struct Queue));
q->front = -1;
q->rear = -1;
return q;
}
// Check if the queue is empty
int isEmpty(struct Queue* q) {
if (q->rear == -1)
return 1;
else
return 0;
}
// Enqueue function
void enqueue(struct Queue* q, int value) {
if (q->rear == SIZE - 1)
printf("\nQueue is full");
else {
if (q->front == -1)
q->front = 0;
q->rear++;
q->items[q->rear] = value;
}
}
// Dequeue function
int dequeue(struct Queue* q) {
int item;
if (isEmpty(q)) {
printf("Queue is empty");
item = -1;
} else {
item = q->items[q->front];
q->front++;
if (q->front > q->rear) {
q->front = q->rear = -1;
}
}
return item;
}
// Create a graph with n vertices
struct Graph* createGraph(int vertices) {
struct Graph* graph = (struct Graph*)malloc(sizeof(struct Graph));
graph->numVertices = vertices;
graph->adjMatrix = (int**)malloc(vertices * sizeof(int*));
for (int i = 0; i < vertices; i++) {
graph->adjMatrix[i] = (int*)malloc(vertices * sizeof(int));
}
graph->visited = (int*)malloc(vertices * sizeof(int));
for (int i = 0; i < vertices; i++) {
graph->visited[i] = 0;
}
return graph;
}
// Perform BFS traversal
void bfs(struct Graph* graph, int startVertex) {
struct Queue* q = createQueue();
graph->visited[startVertex] = 1;
enqueue(q, startVertex);
while (!isEmpty(q)) {
int currentVertex = dequeue(q);
printf("%d ", currentVertex);
for (int i = 0; i < graph->numVertices; i++) {
if (graph->adjMatrix[currentVertex][i] == 1 && graph->visited[i]
== 0) {
graph->visited[i] = 1;
enqueue(q, i);
}
}
}
printf("\n");
}
int main() {
int vertices;
printf("Enter no of vertex\n");
scanf("%d", &vertices);
struct Graph* graph = createGraph(vertices);
printf("Enter %d vertices into matrix\n", vertices);
for (int i = 0; i < vertices; i++) {
for (int j = 0; j < vertices; j++) {
scanf("%d", &graph->adjMatrix[i][j]);
}
}
int startVertex;
printf("Enter starting vertex\n");
scanf("%d", &startVertex);
bfs(graph, startVertex);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct {
int u, v, weight;
} Edge;
Edge edges[MAX];
int parent[MAX];
int rank[MAX];
int edgeCount, vertexCount;
void init() {
for (int i = 0; i < vertexCount; i++) {
parent[i] = i;
rank[i] = 0;
}
}
int find(int i) {
if (parent[i] != i) {
parent[i] = find(parent[i]);
}
return parent[i];
}
void unionSets(int u, int v) {
int rootU = find(u);
int rootV = find(v);
if (rootU != rootV) {
if (rank[rootU] > rank[rootV]) {
parent[rootV] = rootU;
} else if (rank[rootU] < rank[rootV]) {
parent[rootU] = rootV;
} else {
parent[rootV] = rootU;
rank[rootU]++;
}
}
}
int compare(const void* a, const void* b) {
Edge* edgeA = (Edge*)a;
Edge* edgeB = (Edge*)b;
return edgeA->weight - edgeB->weight;
}
void kruskal() {
int mstWeight = 0;
printf("Minimum Spanning Tree Edges:\n");
for (int i = 0; i < edgeCount; i++) {
Edge edge = edges[i];
if (find(edge.u) != find(edge.v)) {
printf("%d - %d : %d\n", edge.u, edge.v, edge.weight);
mstWeight += edge.weight;
unionSets(edge.u, edge.v);
}
}
printf("Spanning tree cost: %d\n", mstWeight);
}
int main() {
// Hardcoded graph input
vertexCount = 6; // Number of vertices
edgeCount = 9; // Number of edges
// Hardcoded edges: (u, v, weight)
edges[0] = (Edge){1, 0, 4};
edges[1] = (Edge){2, 1, 2};
edges[2] = (Edge){5, 2, 2};
edges[3] = (Edge){3, 2, 3};
edges[4] = (Edge){4, 3, 3};
edges[5] = (Edge){1, 0, 4}; // Additional edges can be added here
edges[6] = (Edge){0, 1, 6};
edges[7] = (Edge){0, 2, 7};
edges[8] = (Edge){1, 3, 5};
init();
// Sort edges by weight
qsort(edges, edgeCount, sizeof(edges[0]), compare);
kruskal();
return 0;
}