Articulation.c
Wed Nov 06 2024 09:20:56 GMT+0000 (Coordinated Universal Time)
Saved by @signup1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 100
// Graph representation
int arr[MAX][MAX]; // Adjacency matrix
int dfn[MAX]; // Discovery time for each node
int low[MAX]; // Lowest point reachable from each node
int num; // Counter for discovery time
bool visited[MAX]; // Track if a vertex is visited
bool articulation[MAX]; // Track articulation points
void art(int u, int v, int n) {
dfn[u] = low[u] = num++;
int child = 0;
visited[u] = true;
for (int j = 0; j < n; j++) {
if (arr[u][j] == 1) {
if (dfn[j] == 0) { // If not visited
child++;
art(j, u, n);
if (low[j] >= dfn[u]) {
articulation[u] = true;
}
low[u] = (low[u] < low[j]) ? low[u] : low[j];
} else if (j != v) {
low[u] = (low[u] < dfn[j]) ? low[u] : dfn[j];
}
}
}
// Special case for root node
if (v == -1 && child > 1) {
articulation[u] = true;
}
}
void printVisited(int n) {
printf("Articulation points: ");
for (int i = 0; i < n; i++) {
if (articulation[i]) {
printf("%d ", i);
}
}
printf("\n");
// Print discovery times (dfn)
printf("Discovery times: ");
for (int i = 0; i < n; i++) {
printf("%d ", dfn[i] - 1); // Subtract 1 to adjust to zero-indexed vertices
}
printf("\n");
}
int main() {
int n;
printf("Enter number of vertices: ");
scanf("%d", &n);
// Initialize arrays
for (int i = 0; i < n; i++) {
dfn[i] = low[i] = 0;
visited[i] = false;
articulation[i] = false;
}
// Read adjacency matrix
printf("Enter adjacency matrix:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
}
}
// Start DFS from vertex 0 (can be any vertex, usually 0 for simplicity)
num = 1; // Set the discovery time counter to 1
art(0, -1, n);
// Output the results
printVisited(n);
return 0;
}



Comments