Cod sursa(job #2741152)

Utilizator JmekyHutanu David Jmeky Data 15 aprilie 2021 16:37:16
Problema Parcurgere DFS - componente conexe Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 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, n = 0;

int stack[100001];
int indexStack = 1;

void push(int value)
{
		stack[indexStack++] = value;
}

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)
{
	int k;
	push(node);
	visited[node] = -1;

	while (indexStack != 1)
	{
		k = 0;
		for (int i = 0; i < graph[node].nr_neighbors; i++)
			if (visited[graph[node].neighbors[i].node] == 0)
			{
				k = 1;
				visited[graph[node].neighbors[i].node] = 1;
				push(graph[node].neighbors[i].node);
			}
		node = stack[indexStack - 1];
		if (k == 0)
		{	
			if (visited[node] == -1)
			{
				n++;
				indexStack--;
				stack[indexStack] = 0;
				for (int i = node + 1; i <= N; i++)
					if (visited[i] == 0)
						dfs_edges(graph, i, visited);
			}
			else
			{
				indexStack--;
				node = stack[indexStack - 1];
				stack[indexStack] = 0;
			}
		}
	}
}

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

	int* visited = (int*)calloc(N + 1, sizeof(int));
	dfs_edges(graphE,1,visited);

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

	return 0;
}