Cod sursa(job #2364390)

Utilizator stratonedanielDaniel Stratone stratonedaniel Data 4 martie 2019 03:28:28
Problema Parcurgere DFS - componente conexe Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct mylist
{
	int number_of_neighbors;
	int *neighbors;

}AdjacencyList;	

void DFS(AdjacencyList *list,int index,bool **visited)
{
	if(list[index].number_of_neighbors==0)
		return;

	for(int i=0;i<list[index].number_of_neighbors;i++)
		if((*visited)[list[index].neighbors[i]]==false)
		{
			(*visited)[list[index].neighbors[i]]=true;
			DFS(list,list[index].neighbors[i],visited);
		}

}

int main()
{
	FILE *read=fopen("dfs.in","r");
	FILE *write=fopen("dfs.out","w");

	int number_of_vertices;
	int number_of_arcs;

	fscanf(read,"%d %d",&number_of_vertices,&number_of_arcs);

	bool*visited=calloc(number_of_vertices+1,sizeof(bool));

	AdjacencyList *adjlist=calloc(number_of_vertices+1,sizeof(AdjacencyList));

	int x,y;	

	for(int i=0;i<number_of_arcs;i++)
	{
		fscanf(read,"%d%d",&x,&y);
		
		if(adjlist[x].number_of_neighbors==0)
		{
			adjlist[x].number_of_neighbors=1;

			adjlist[x].neighbors=(int*)calloc(1,sizeof(int));
			adjlist[x].neighbors[0]=y;

		}
		else
		{
			adjlist[x].number_of_neighbors++;

			adjlist[x].neighbors=(int*)realloc(adjlist[x].neighbors,adjlist[x].number_of_neighbors*sizeof(int));
			adjlist[x].neighbors[adjlist[x].number_of_neighbors-1]=y;

		}

		if(adjlist[y].number_of_neighbors==0)
		{
			adjlist[y].number_of_neighbors=1;

			adjlist[y].neighbors=(int*)calloc(1,sizeof(int));
			adjlist[y].neighbors[0]=x;

		}
		else
		{
			adjlist[y].number_of_neighbors++;

			adjlist[y].neighbors=(int*)realloc(adjlist[y].neighbors,adjlist[y].number_of_neighbors*sizeof(int));
			adjlist[y].neighbors[adjlist[y].number_of_neighbors-1]=x;

		}


	}

	int mark=0;

	for(int i=1;i<=number_of_vertices;i++)
	{
		if(visited[i]==false)
		{
			mark++;
			DFS(adjlist,i,&visited);
		}

	}

	fprintf(write, "%d\n", mark);

	for(int i=1;i<=number_of_vertices;i++)
		if(adjlist[i].number_of_neighbors!=0)
			free(adjlist[i].neighbors);

	free(visited);
	free(adjlist);
	fclose(read);
	fclose(write);	

	return 0;
}