Cod sursa(job #2741258)

Utilizator simona.catanoiuSimona-Mihaela Catanoiu simona.catanoiu Data 15 aprilie 2021 19:39:29
Problema Parcurgere DFS - componente conexe Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct vertex {
	int name;
	struct vertex** neighbors;
	int numNeighbors;
} vertex;

typedef struct graphVertex {
	int numNodes;
	int numEdges;
	vertex* nodes;
} graphVertex;

void dfs_vertex(graphVertex graph, int currentNode, int* visited)
{
	visited[currentNode] = 1;
	for (int j = 0; j < graph.nodes[currentNode].numNeighbors; j++) {
		if ((!visited[graph.nodes[currentNode].neighbors[j]->name])) {
			dfs_vertex(graph, graph.nodes[currentNode].neighbors[j]->name, visited);
		}
	}
}
graphVertex initializare(const char* fileName)
{
	graphVertex graph;
	vertex** aux;
	graph.numEdges = 0;
	graph.numNodes = 0;
	int node1, node2;
	int dim_initial = 20;
	FILE* f = fopen(fileName, "r");
	if (f == NULL)
		return graph;

	fscanf(f, "%i%i", &(graph.numNodes), &(graph.numEdges));
	graph.nodes = (vertex*)malloc(sizeof(vertex) * graph.numNodes);
	if (graph.nodes == NULL)
		return graph;
	for (int i = 0; i < graph.numNodes; i++) {
		graph.nodes[i].name = i;
		graph.nodes[i].numNeighbors = 0;
		graph.nodes[i].neighbors = NULL;
	}
	for (int i = 0; i < graph.numEdges; i++) {
		fscanf(f, "%d %d", &node1, &node2);
		if (graph.nodes[node1].numNeighbors == 0) {
			graph.nodes[node1].neighbors = malloc(sizeof(vertex*) * dim_initial);
		}
		if (graph.nodes[node1].numNeighbors > dim_initial) {
			aux = malloc(sizeof(vertex*) * (graph.nodes[node1].numNeighbors));
			for (int i = 0; i < graph.nodes[node1].numNeighbors; i++)
				aux[i] = graph.nodes[node1].neighbors[i];
			free(graph.nodes[node1].neighbors);
			graph.nodes[node1].neighbors = malloc(sizeof(vertex*) * graph.nodes[node1].numNeighbors);
			for (int i = 0; i < graph.nodes[node1].numNeighbors; i++)
				graph.nodes[node1].neighbors[i] = aux[i];
			graph.nodes[node1].neighbors[graph.nodes[node1].numNeighbors] = &graph.nodes[node2];
			free(aux);
		} else
			graph.nodes[node1].neighbors[graph.nodes[node1].numNeighbors] = &graph.nodes[node2];
		graph.nodes[node1].numNeighbors++;
	}
	fclose(f);
	return graph;
}
int main()
{
	FILE* fout;
	graphVertex graf = initializare("dfs.in");
	int* vizitat;
	int contor = 0;
	vizitat = calloc(0, sizeof(int) * graf.numNodes);
	for (int i = 0; i < graf.numNodes; i++) {
		if (!vizitat[graf.nodes[i].name]) {
			dfs_vertex(graf, i, vizitat);
			contor++;
		}
	}
	fout = fopen("dfs.out", "w");
	fprintf(fout, "%d", contor);
	fclose(fout);
	return 0;
}