Cod sursa(job #3122455)

Utilizator smoggyBorcila Vasile smoggy Data 19 aprilie 2023 09:48:05
Problema Parcurgere DFS - componente conexe Scor 5
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.2 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct edge {
	int leftNode;
	int rightNode;
} edge;

typedef struct graphEdges {
	edge *edges;
	int numNodes;
	int numEdges;
} graphEdges;

typedef struct distance {
	int name;
	int distance;
} distance;

typedef struct listNode {
	int name;
	struct listNode *next;
} listNode;

void push(listNode **listStart, int element)
{
	listNode *node = (listNode *)malloc(sizeof(listNode));
	if (node == NULL) {
		printf("ERROR: CAN NOT ALLOCATE RAM\n");
		return;
	}
	node->next = *listStart;
	node->name = element;
	*listStart = node;
}

int pop(listNode **listStart)
{
	listNode *aux = (*listStart);
	int n = aux->name;
	*listStart = (*listStart)->next;
	free(aux);
	return n;
}

graphEdges readGraphEdgeList(const char *fileName)
{
	graphEdges graph;
	FILE *f = fopen(fileName, "r");
	if (f == NULL)
		return graph;
	char s[10];
	fscanf(f, "%d", &graph.numNodes);
	fscanf(f, "%d", &graph.numEdges);
	graph.edges = (edge *)malloc(graph.numEdges * sizeof(edge));
	for (int i = 0; i < graph.numEdges; i++) {
		fscanf(f, "%d", &graph.edges[i].leftNode);
		fscanf(f, "%d", &graph.edges[i].rightNode);
	}
	fclose(f);
	return graph;
}
int dfs_edges(graphEdges graph, int currentNode, int *visited)
{
	int comp = 1;
	visited = (int *)malloc(graph.numNodes * sizeof(int));
	for (int i = 0; i < graph.numNodes; i++)
		visited[i] = 0;
	listNode *node = NULL;
	push(&node, currentNode);
	visited[currentNode] = 1;
	while (node != NULL) {
		int j = pop(&node);
		for (int i = 0; i < graph.numEdges; i++)
			if (j == graph.edges[i].leftNode && visited[graph.edges[i].rightNode] == 0) {
				push(&node, graph.edges[i].rightNode);
				visited[graph.edges[i].rightNode] = 1;
				break;
			}
		if (node == NULL) {
			for (int i = 0; i < graph.numEdges; i++)
				if (visited[graph.edges[i].rightNode] == 0) {
					push(&node, graph.edges[i].rightNode);
					visited[graph.edges[i].rightNode] = 1;
					comp++;
					break;
				}
		}
	}
	return comp;
}

int main()
{
	graphEdges newGraph = readGraphEdgeList("dfs.in");
	int *visited = NULL;
	FILE *f = fopen("dfs.out", "w");
	if (f == NULL)
		exit(-1);
	fprintf(f, "%d", dfs_edges(newGraph, 1, visited));
	fclose(f);
	return 0;
}