Cod sursa(job #2741203)

Utilizator JmekyHutanu David Jmeky Data 15 aprilie 2021 18:00:13
Problema Parcurgere DFS - componente conexe Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

typedef struct graphEdges {
	int node;
	struct graphEdges* neighbors;
	int nr_neighbors;
} graphEdges;

int N, M;

graphEdges* readGraphEdgeList(const char* fileName)
{
	FILE* f = fopen(fileName, "r");
	fscanf(f, "%d%d", &N, &M);
	graphEdges* graph=(graphEdges*)malloc((N+1)*sizeof(graphEdges));

	for (int i = 1; i <= N; i++)
	{
		graph[i].node = i;
		graph[i].nr_neighbors = 0;
		graph[i].neighbors = NULL;
	}

	int left, right;
	for (int i = 0; i < M; i++) {
		fscanf(f, "%d%d", &left,&right);
		graph[left].nr_neighbors++;
		graph[left].neighbors = (graphEdges*)realloc(graph[left].neighbors, (graph[left].nr_neighbors + 1) * sizeof(graphEdges));
		graph[left].neighbors[graph[left].nr_neighbors - 1] = graph[right];
		
		graph[right].nr_neighbors++;
		graph[right].neighbors = (graphEdges*)realloc(graph[right].neighbors, (graph[right].nr_neighbors + 1) * sizeof(graphEdges));
		graph[right].neighbors[graph[right].nr_neighbors - 1] = graph[left];
	}

	fclose(f);
	return graph;
}

void dfs_edges(graphEdges* graph,int node,int* visited)
{
	visited[node] = 1;
	for (int i = 0; i < graph[node].nr_neighbors; i++)
		if (visited[graph[node].neighbors[i].node] == 0)
			dfs_edges(graph, graph[node].neighbors[i].node, visited);
}

int main()
{
	graphEdges* graphE = readGraphEdgeList("dfs.in");

	int n = 0;
	int* visited = (int*)calloc(N + 1, sizeof(int));
	for (int i = 1; i <= N; i++)
		if(visited[i]==0)
		{
			n++;
			dfs_edges(graphE, i, visited);
		}

	FILE* f = fopen("dfs.out", "w");
	fprintf(f, "%d", n);
	fclose(f);

	return 0;
}